编程基础 | PHP代码审记(上 )

红日安全推出的适合新手入门系列教程专刊上线啦!红日安全专一新手入门教程。转眼间红日安全又成长了一岁,在这一年里,团队成长了不少不少。目前团队全部的文章对外都是公开的,但愿能够给新手一个填补空白的地方。2020年,团队开始新的方向,和一些安全培训厂商进行合做,但愿作出更多安全做品。感谢团队每一位成员为团队的辛勤付出,但愿每个人在团队里面有更大的做为。也感谢一直在后面默默支持咱们的红粉,也祝愿大家在新的一年学到更多的干货!php

1.1 PHP安全入门到精通
1.1.1 概述

PHP安全入门到精通书刊,年后所有放出。为了团队发展,我的在闲暇时间为团队作了一个PHP安全入门到精通书籍,本次书籍摘出一部分让你们入门,更详细的会在年后发出,这次书籍但愿让没有基础的安全人员也能够写本身网站,搭建本身的PHP工具和PHP靶场平台。本次专刊发表几节,由于总体文章尚未写完,因此先放出一部分供你们学习。后续文章在年后第二次专刊将在此奉献,但愿你们在新的一年里,学习到更多的技能。所有内容以下:html

v2-47aa4c782cf876d8fb591e7ac2725e4c_1440w.jpg

1.1.2 PHP基础知识java

1.1.2.1 全局变量认识mysql

1.1.2.1.1 $GLOBALSios

globals是PHP内置的能够自动获取当前页面中的全部变量的内容.web

代码解释正则表达式


v2-dddc66c9dc9bd256b42c4f9ad52dec4b_1440w.jpgv2-522cc074ba597fd0204fac1c6f2d1ec2_1440w.jpgv2-826ef84296ccb088b29f1208f27fb50d_1440w.jpg

1.1.2.1.2 $_SERVERredis

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由Web 服务器建立。不能保证每一个服务器都提供所有项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。sql

代码解释:mongodb

echo '';foreach($_SERVER as $key  =>$value){echo '';echo ''.$key.''.''.$value.'';echo '';}echo '';?>


v2-c6bb96125d22f51174c48b02123a2e38_1440w.jpg

1.1.2.1.3 $_FILES

说明:获取上传文件的信息代码说明:hr.html

红日安全文件名:

Hr.php

  0){echo "错误:: " . $_FILES["file"]["error"] . "";}else{echo "上传文件名: " . $_FILES["file"]["name"] . "";echo "文件类型: " . $_FILES["file"]["type"] . "";echo "文件大小: " . ($_FILES["file"]["size"] / 1024) .  "kB";echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] ."";// 判断当期目录下的 upload  目录是否存在该文件// 若是没有 upload 目录,你须要建立它,upload 目录权限为  777if (file_exists("upload/" . $_FILES["file"]["name"])){echo $_FILES["file"]["name"] . " 文件已经存在。 ";}else{// 若是 upload 目录不存在该文件则将文件上传到 upload  目录下move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);echo "文件存储在: " . "upload/"  .$_FILES["file"]["name"];}}}else{echo "非法的文件格式";}?>

1.1.2.1.4 $_GET:URL方式传递数据

说明:其实就是浏览器的地址栏传递方式,传递方式:URL地址?参数1=值1&参数2=值2……………………………传递形式:表单的get方式和超连接方式

代码解释:

USERNAME:PASSWORD:

$_GET方式是在URL地址栏里面直接对接传输。

v2-778867de2eae95ae72e1ee8ac6cce9b1_1440w.jpg

1.1.2.1.5 $_POST: HTTP POST方式传递数据

说明:经过HTTP协议的post方式来传递数据。POST方式传输是在地址栏里面看不见地址,例如隐式传输。利用谷歌浏览器查看。

USERNAME:PASSWORD:

1.1.2.1.6 $_REQUEST

v2-dd340799eb6e5817330404b8a1d22084_1440w.jpgv2-2b088f50443b2f139670ce01945afc85_1440w.jpg

默认三种方式均可以提交。若是设置接受get方式,咱们以POST方式进行提交,浏览器会找不到该值。1.1.3二正则表达式

1.1.3.1 正则表达式入门1.1.3.1.1 入门简介

在编写处理字符串的程序或网页时,常常会有查找符合某些复杂规则的字符串的须要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。极可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是和?。若是你想查找某个目录下的全部的Word文档的话,你会搜索.doc。在这里,*会被解释成任意的字符串。和通配符相似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——固然,代价就是更复杂——好比你能够编写一个正则表达式,用来查找全部以0开头,后面跟着2-3个数字,而后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。正则表达式就像筛子,将咱们须要的内容(符合规则的内容)漏下去,将不符合规则的内容过滤掉而咱们学习正则表达式,主要是如何定义这一套规则1.1.3.2 正则表达式相关的函数

1) preg_match使用正则表达式(规则)对字符串进行筛选,筛选到一个结果即中止

v2-12a3382abab59a2847bf40db19cc9121_1440w.jpg

2) preg_match_all使用正则表达式(规则)对字符串进行筛选,筛选到结果先保存到数组,并继续筛选,直到字符串结束

v2-16ae4de082cfd491fb7b8ad3ae891157_1440w.jpg

3) preg_replace使用正则表达式(规则)对字符串进行筛选,再将筛选的内容进行替换

v2-d65508b529b01b5f29ad02c594701b2e_1440w.jpg

4) preg_split使用正则表达式(规则)对字符串进行拆分explode()是根据某个字符进行分割

v2-67eec767431c021c1296857a3a63e4f3_1440w.jpg

使用 preg_split 能够先根据定义的规则进行筛选,再根据筛选的结果拆分字符串

v2-bfe473f6bdadb3750a01cdceb2dd6ccf_1440w.jpg

1.1.3.3 正则表达式应用场景

用户注册时,先定义用户名的规则(字母、数字、下划线的组合,6-10位),而后再使用该规则验证用户的输入

v2-2e9ff93c5caebf8f7e078cb0ae738590_1440w.jpg

内容采集(将其余网站的内容采集下来,保存到咱们的数据库),须要告诉程序须要哪些内容(定义好规则)1.1.3.4 表达式语法

定界符:表示规则的边界,从哪里开始到哪里结束

v2-d467da728899907f59fd1a7bffea866e_1440w.jpg

元字符:元字符就表示筛选的内容(一个字符)例如:咱们可使用一个字符表示筛选的就是这个字符

$reg='/W/';$str='helloWorld';preg_match($reg,$str,$match);var_dump($match);

v2-014d44e7352359037961fe07a31e32af_1440w.jpg

除了使用一个字符表示筛选的字符以外,正则表达式还提供了一些特殊的符号表示筛选的内容例如:可使用转义字符表示筛选范围中的一个\w 表示筛选的内容是字母、数字、下划线中的任意一个\W \w的反义词,表示除了字母、数字、下划线以外的任意一个字符

v2-c12f76bd0f8891888719224e55fe7179_1440w.jpgv2-4592298220f128cb023b5b385aa66022_1440w.jpg

\d,表示筛选数字(0-9)范围中的任意一个

\D,表示除了数字以外的任意一个字符

v2-35262b0be254c8fc8d2a4569a4f1070b_1440w.jpg

\s:space空格\S:除了空格以外的任意一个字符

v2-bf7ac0849040cb7df11c5a34c535282a_1440w.jpg

表示**中的任意一个字符[a-z],小写的a到小写的z之间的任意一个字符[hel],表示hel这几个字母之间的任意一个[^hel],中括号里面的^表示非,除了hel以外的任意一个字符

v2-8247112448727ac49342f816d6505d64_1440w.jpgv2-483e294e9108ef11b83766b676ed8284_1440w.jpgv2-d96219d176a61e85402d5548e70650ee_1440w.jpg

英文的点号,表示除了换行符以外的任意一个字符

v2-494912a9828e702686b54f4dd8b010d1_1440w.jpg

|竖线,表示 或者

v2-f9a9c583cb88888f619faba2fbbceb8c_1440w.jpg

量词默认状况下,正则表达式采用的是贪婪模式(尽量多的匹配)量词表示元字符的数量,也就是筛选的内容的长度{m},固定数量m个{n,m},表示最少n个,最多m个{n,} ,表示最少n个,最多无穷个*,表示0个或多个+,表示至少1个?,表示0个或1个

v2-a901d72e24c2ea8488f3d257b0081136_1440w.jpg

? 的特殊使用? 若是放在元字符后面,表示0个或1个,可是若是放在量词的后面表示将贪婪模式修改成懒惰模式(尽量少的匹配)举例说明:

v2-b157ba43abb34d83619490522ee89e1f_1440w.jpgv2-f946cb60ab403df939e72a0490617fa4_1440w.jpg

^ $ 表示从开始到结束

v2-4470fb7ab6217154725ae0cdf7a81f99_1440w.jpg

模式修正符模式修正符,用来对前面的正则表达式进行修饰做用1) i忽略大小写没有使用i模式修正符的时候

使用i模式修正符,表示忽略大小写

v2-dd2fa8a6c26b791a4d52659679e463dd_1440w.jpg

2) s,表示万能点模式没有使用s修饰符的代码

v2-3a8fceb9e907224b9900fcf786e4213d_1440w.jpg

使用s之后

v2-641d780fa10e882fba8855b857d7dcd9_1440w.jpg

3) U,表示将贪婪模式修改懒惰模式

默认是贪婪模式,就会尽量多的去匹配

v2-f1409f8d172cec680a2e3640bf292483_1440w.jpg

4) 分组的使用使用正则表达式进行匹配的时候,可使用()将须要的内容括起来,每一个小括号的内容就会当作一个小组,并保存到数组中。第一个()的内容会保存到数组下标为1的元素中第二个()的内容会保存到数组下标为2个元素中以此类推Ÿ $res=‘/<a.+href=”(.+)”>(.+)<\/a>/’;筛选URL

v2-542f92777749f6d20c72ddbc0a7daf68_1440w.jpgv2-5d67768afa8ba76be93ca3ff1e5316a2_1440w.jpg

1.1.3.5 正则实例

用户名验证

6-30位,字母、数字、下划线组合,字母开头

$reg='/^[a-zA-Z]\w{5-29}$/';$res='ehllo1123';preg_match($reg,$res,$match);if($match){echo "success";}else{echo "fail";}

v2-0c5d929915bc3c2afe780fe77d4458a5_1440w.jpg

手机号验证

使用正则表达式(规则)对字符串进行筛选,筛选到一个结果即中止

v2-5b765068f67b36f72e98d6bdbb51d7a9_1440w.jpg

密码验证

6-20位,字母、数字或符号若是纯字母、纯数字的话,提示密码太简单了若是字母、数字的组合的话,提示密码比较安全若是是字母、数字、特殊符号的组合,提示密码杠杠的

v2-93c0e7d8a9c04d012f3bdcb18b8c5509_1440w.jpg

邮箱验证

邮箱没有固定的规则,该规则本身定,能够参考下面的合法的邮箱,本身定义规则

v2-c96dcce6e1a9f72fefd0b1ebed929747_1440w.jpg

正则漏洞

$ip = '1.1.1.1  abcd'; //  能够绕过if(!preg_match("/(\d+).(\d+).(\d+).(\d+)/",$ip)) {die('error');} else  {echo('key...');}

在这里没有限制开始和结束,致使输入危险字符绕过。n 第二个案例利用\s空格在shell环境下执行命令成功。

$file_name = $_GET["path"];if(!pregmatch("/^[/a-zA-Z0-9-s]+.rpt$/m", $file_name))  {echo "regex failed";} else  {echo exec("/usr/bin/file -i -b " .  $file_name);}

v2-049c239b465808366618c266e18fd533_1440w.jpg

n 第三个正则案例

blog.chaitin.cn/phpmail
1.1.4 socket函数讲解1.1.4.1 socket 介绍Socket是应用层与TCP/IP协议族通讯的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来讲,一组简单的接口就是所有,让Socket去组织数据,以符合指定的协议。相同的有MySQL等相似操做,而MySQL它只是已经封装好了,咱们直接调用就能够。链接服务端,输入帐号和密码就能够。而socket貌似只给咱们提供了一堆函数。经过函数咱们能够去直接利用。关于socket,咱们讲两种方案,一种是基于内核的socket,另一种是PHP扩展带有的socket功能。l 基于内核的socketŸ fsockopenŸ pfsockopenl PHP扩展模块带有的socket功能Ÿ socket_createŸ socket_bindŸ socket_connectŸ socket_accept首先先讲关于扩展模块socket功能。Socket链接图(图片来源于网络),其实和Python原理是同样的。

v2-2506a1a9fef3dcf25427dbc4457b97dd_1440w.jpg

Ÿ socket关键函数—socket_create()socket的关键函数1:socket_create($net参数1,$stream参数2,$protocol参数3)做用:建立一个socket套接字,说白了,就是一个网络数据流。返回值:一个套接字,或者是false,参数错误发出E_WARNING警告Ÿ socket关键函数—socket_connect()socket_connect($socket参数1,$ip参数2,$port参数3)做用:链接一个套接字,返回值为true或者false参数1:socket_create的函数返回值参数2:ip地址参数3:端口号Ÿ socket关键函数—socket_bind()socket_bind($socket参数1,$ip参数2,$port参数3)做用:绑定一个套接字,返回值为true或者false参数1:socket_create的函数返回值参数2:ip地址参数3:端口号Ÿ socket关键函数—socket_listen()socket_listen($socket参数1,$backlog 参数2)做用:监听一个套接字,返回值为true或者false参数1:socket_create的函数返回值参数2:最大监听套接字个数Ÿ socket关键函数—socket_accept ()socket_accept($socket)做用:接收套接字的资源信息,成功返回套接字的信息资源,失败为false参数:socket_create的函数返回值Ÿ socket关键函数—socket_read ()socket_read($socket参数1,$length参数2)做用:读取套接字的资源信息,返回值:成功把套接字的资源转化为字符串信息,失败为false参数1:socket_create或者socket_accept的函数返回值参数2:读取的字符串的长度Ÿ socket关键函数—socket_wrete ()socket_write($socket参数1,$msg参数2,$strlen参数3)做用:把数据写入套接字中返回值:成功返回字符串的字节长度,失败为false参数1:socket_create或者socket_accept的函数返回值参数2:字符串参数3:字符串的长度Ÿ socket关键函数—socket_close ()socket_close($socket)做用:关闭套接字返回值:成功返回true,失败为false参数:socket_create或者socket_accept的函数返回值函数讲解完成之后,咱们须要对socket创建服务端和客户端。首先一下是创建服务端。

Server_socket.php

小提示:请注意上面的socket_bind,socket_listen,socket_accept三个函数的执行顺序不可更改,也就是说必须先执行socket_bind,再执行socket_listen,最后才执行socket_accept客户端代码Client_server.php 1, "usec" =>  0));//发送套接流的最大超时时间为6秒socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=> 6, "usec" =>  0));/*设置socket链接选项,这两个步骤你能够省略///链接服务端的套接流,这一步就是使客户端与服务器端的套接流创建联系if(socket_connect($socket,'127.0.0.1',8888) == false){echo 'connect failmassege:'.socket_strerror(socket_last_error());}else{$message = 'l love you 我爱你 socket';//转为GBK编码,处理乱码问题,这要看你的编码状况而定,每一个人的编码都不一样$message = mb_convert_encoding($message,'GBK','UTF-8');//向服务端写入字符串信息if(socket_write($socket,$message,strlen($message)) ==false){echo'failtowrite'.socket_strerror(socket_last_error());}else{echo 'client write success'.PHP_EOL;//读取服务端返回来的套接流信息while($callback = socket_read($socket,1024)){echo 'server return message is:'.PHP_EOL.$callback;}}}socket_close($socket);//工做完毕,关闭套接流

1.1.4.2 PHP fsockopen 使用方法讲解讲解fsockopen函数,主要是后面咱们会讲到主机端口扫描,因此这个函数咱们必须讲解。上面在讲socket编程的时候,已经稍微讲解一点fsockopen函数。phpfsockopen是一个很是强大的函数,支持socket编程,可使用fsockopen实现邮件发送等socket程序等等,使用fsockopen须要本身手动拼接出header部分,本文章向你们介绍fsockopen使用方法和实例讲解,须要的朋友能够参考一下。Php fsockopen介绍fsockopen — 打开一个网络链接或者一个Unix套接字链接。语法:resource fsockopen ( string $hostname [, int $port = -1 [, int&$errno [, string &$errstr [, float $timeout =ini_get("default_socket_timeout") ]]]] )参数:(1)hostname 若是安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可使用基于TCP/IP协议的SSL或者TLS的客户端链接到远程主机。(2)port 端口号。若是对该参数传一个-1,则表示不使用端口,例如unix://。(3)errno 若是errno的返回值为0,并且这个函数的返回值为 FALSE ,那么这代表该错误发生在套接字链接(connect())调用以前,致使链接失败的缘由最大的多是初始化套接字的时候发生了错误。(4)errstr 错误信息将以字符串的信息返回。(5)timeout 设置链接的时限,单位为秒。返回值:fsockopen() 将返回一个文件句柄,以后能够被其余文件类函数调用(例如:fgets() , fgetss() , fwrite() , fclose() 还有 feof() )。若是调用失败,将返回 FALSE 。

v2-f7c28a20aa340a09e3f7fafc580fb77f_1440w.jpg

更详细能够参考手册。(php.net/manual/zh/funct)案例:尝试去访问一个本地80端口,咱们查看一下返回值,有什么效果。

\n";}else{fputs($fp,"GET / HTTP/1.0\N HOST:127.0.0.1\n\n");while(!feof($fp)){echo fgets($fp,128);}fclose($fp);}

v2-1c8534a9bd1ff87a131a0a06fdb4b3b6_1440w.jpg

和BurpSuite访问效果相同。

v2-f9c1ea3f132dd5df793047752dda31f2_1440w.jpg

内容显示效果是同样的呢。咱们能够看到若是返回200证实80端口开启。以这个原理,咱们开始写一个端口扫描器,利用fsockopen函数。既然测试端口,咱们先看一下常见安全端口和对应属性通常默认经常使用端口扫描介绍:

3311:3312 kangle主机管理系统3389 远程登陆4440 rundeck是用java写的开源工具5672 rabbitMQ5900 VNC6082 varnish 参考WooYun: Varnish HTTP accelerator CLI 未受权访问易致使网站被直接篡改或者做为代理进入内网6379 redis 通常无认证,可直接访问7001 weblogic8080 tomcat8089 jboss8161 activeMQ8649 ganglia集群系统监控软件9000 fastcgi服务9090 IBM服务9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞9999 amg加密版10050 zabbix11211 memcache 未受权访问27017,28017 mongodb 未受权访问 mongodb默认无口令登陆3777 大华监控设备50000 sap netweaver远程命令执行漏洞50060 50070 hahoop、apache hasoop21 默认是ftp端口 主要看是否支持匿名,也能够跑弱口令22 默认是ssh端口23 默认是telnet端口25 默认是smtp服务53 默认是DNS123 是NTP161,162,8161 snmp服务(8161 IBM一款产品所开放的SNMP)389 ldap团体443 openssl 、hearthleed512,513 rlogin服务或者是exec873 rsync 主要看是否支持匿名,也能够跑弱口令1433 mssql数据库1080 socks代理1521 oracle1900 bes默认后台2049 nfs服务2601,2604 zebra路由 默认密码zebra2082,2083 cpanel主机管理系统3128,3312 squid代理默认端口,若是没设置口令极可能就直接漫游内网了3306 mysql数据库4899 R-admin 链接端4440 rundeck rundeck 参考WooYun: 借用新浪某服务成功漫游新浪内网8834 nessus4848 glashfish

咱们须要在代码里面设置相关数组,设置端口一个数组,而后在设置一个属性的数组。简单框架以下

<html>
<title>红日安全</title>
<body align="center">
<form action="#" method="post">
<h4><b>Please input IP address </b></h4><input  type="text"
name="ip"  />
<input type="submit" name="submit"/>
</form>
</body>
</html>
<?php
$port=$_POST['ip'];
.....
?>

v2-2d1d20efa91497ce200cc15a11440112_1440w.jpg

根据框架,咱们开始补充代码,进行不断增强。代码只是入门级代码,咱们没有进过任何修饰。

v2-9388a00c2f6c420a4274fb659a3f6d76_1440w.jpg

首先咱们定义了一个表格头,内容以下

<table border="1px" align="center">
<tr>
<td>id</td>
<td>Port</td>
<td>Server</td>
<td>Status</td>
</tr>

核心PHP文件以下

<?php
$ip=$_POST['ip'];
if(ip2long($ip)){
$_ip=explode($ip,".");
foreach($_ip as $key =>  $value){
if($value <0 ||  $value>255){
die("Invalid IP");
}
}
//判断ip地址是否符合,利用两个函数,一个ip2long函数。另一个利用
explode函数,explode函数主要对ip地址进行分割。ip2long  — 将 IPV4  的
字符串互联网协议转换成长整型数字
}
$port=array(
21,
23,
25,
79,
80,
110,
135,
137,
138,
139,
143,
443,
445,
1433,
3306,
);
$msg=array(
'Ftp',
'Telnet',
'Smtp',
'Finger',
'Http',
'Pop3',
'Location Service',
'Netbios-NS',
'Netbios-DGM',
'Netbios-SSN',
'IMAP',
'Https',
'Microsoft-DS',
'MSSQL',
'MYSQL',
'Terminal Services',
);
//定义了两个数组,一个是端口数组,另一个是对端口的解释。
foreach($port as $key  =>$value){
echo '<tr>';
echo '<td>'.$key.'</td>';
echo '<td>'.$value.'</td>';
echo '<td>'.$msg[$key].'</td>';
$fp=@fsockopen($ip,$value,$errno,$errstr,1);
$res=$fp?'<span>Open</span>':'<span>Close</span>';
echo '<td>'.$res.'</td>';
}
//主要经过fsockopen这个函数进行判断端口是否打开,若是为真则返回
true,为假则执行false
?>

你怎么看待红日发布的这款新专刊?

你认为他有爆红的潜质嘛?

欢迎在评论区留言分享你的观点和见解

v2-1f5ea65d283db490ca9f2edb2e7cebb2_1440w.jpg

相关文章
相关标签/搜索