开发者社区> spleated> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

php代码审计分段学习(php_bug)[1]

简介: 参考:https://github.com/bowu678/php_bugs 1.extract变量覆盖 看extract变量覆盖这个的时候,代码里面出现了trim这个函数,就查了一下用法,说是去掉字符串开头和结尾的换行符或者是空格,还可以去掉不想出现的字符串。
+关注继续查看

参考:https://github.com/bowu678/php_bugs

1.extract变量覆盖

看extract变量覆盖这个的时候,代码里面出现了trim这个函数,就查了一下用法,说是去掉字符串开头和结尾的换行符或者是空格,还可以去掉不想出现的字符串。要说起来这个函数还是挺好理解的。就比如说最后一个吧,heordw,先从首开始看,到l的时候想去掉的字符串里面没有,所以到l的时候不再去掉任何字符,然后从尾往前看,是和首同样的道理

$str="helloeorldhelloworld";

echo trim($str,"herl");//oeorldhelloworld

echo trim($str,"heorld");//w

$str="helloeorlwdhelloworod";

echo trim($str,"heordw");//lloeorlwdhell


file_get_contents($flag)//若是$flag的内容为字符串直接返回为空,若是txt的话能打开里面的内容。

extract($_GET)这个函数可以判断是get提交还是post提交,当为get提交时可以url中可以这样使用http://localhost/php/extract1.php?flag&shiyan  #flag和shiyan是php中的两个变量。在extract()中,若是在url中有给变量赋值,则原本这个变量的值会被替换。可以预防被覆盖的方法是在php.ini这个文件中有register_globals这个变量的话将它改为off就行了,可能php版本问题,我的文件中没有这个变量。。。可能这个bug还是挺有用的。。


2.绕过过滤的空白字符


img_620e35fd43f112292fd9212414e87ba0.png

首先is_numeric这个函数要求的是为数字字符串,所以要想跳过这个函数可以加字母或者加一些编码后的符号。

然后$req['number']==strval(intval($req['number']))这个是要求输入的字符串取整和原本字符串相等,但是取整的时候若是有字母或是特殊字符直接截断了,若是构造这个数字100.000000000000010可以跳过这个函数,但是最开始的条件就跳不过了,若是在后面加上字母什么的可以跳过第一个,但是传入的字符串是存到数组中的,所以自己不会发生溢出情况。

$number[$i] !== $number[$j],后面的这个函数就容易实现了%00%0c191,%0c是\f的转义字符,%00的ascii值是0,后面的数字可以任意写,%00为截断,不能省略。

img_6b342066f417723efe5a573f4712e3b1.png

3.多重加密

这是题目给的加密方式


img_3d40d20eb8afb4a3c2a2e5ed63cf3afb.png

这是根据题目写出的解密方式


img_8e1066f9decb8091d4b8a639ca5d59b8.png

4.SQL注入_WITH ROLLUP绕过(实验吧 因缺思汀的绕过)

$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";这个是不能使用的单词。

mysql_num_rows($query) == 1//这个是要求函数返回结果集中行的数目必须为1

$key['pwd'] == $_POST['pwd']这个则是要求了提交的密码与数据库中的密码相等才能输出flag

当用rollup这个语句的时候,会在数据库的最后一行生成一个密码为NULL的字段


img_e1a121f32d12b0869ad6bd6452aff8c3.png

用下面这个payload

' or 1=1 group by pwd with rollup limit 1 offset 2 #

这样查询语句就会变成

SELECT * FROM interest WHERE uname = ' ' or 1=1 group by pwd with rollup limit 1 offset 2 #

group by pwd with rollup 这个可以在数据库中添加一行pwd为NULL的数据,limit 1是之查询一行,offset 2这个数字可以换,不同的数字出现的是不同行的内容。


5.ereg正则%00截断

ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE //这个函数要求输入的密码只能是大小写字母和数字

strlen($_GET['password']) < 8 && $_GET['password'] > 9999999这个要求了输入的密码长度小于8但是还得大于9999999,可以使用科学计数法表示,计算器或电脑表达10的的幂是一般是e

strpos ($_GET['password'], '*-*') !== FALSE,strpos函数是查找后面的字符串在前面的字符串出现的位置,所以输入的密码中还得有*-*,但是前面的ereg函数过滤了特殊字符,这时候可以用ereg%00截断这个bug,ereg读到%00的时候,就截止了,所以1e9%00*-*就可以。


6.strcmp比较字符串

strcmp($_GET['a'], $flag) == 0// 参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;只有两者相等,才返回 0。

strcmp只会处理字符串参数,如果给个数组的话,就会返回NULL,而判断使用是==,NULL==0是bool(true),所以构造这个函数a[]=1就行了。


7.sha1()函数比较绕过

$_GET['name'] == $_GET['password'])//若是传入的两个参数不同才能绕过这个函数

sha1($_GET['name']) === sha1($_GET['password'])

sha1()函数默认的传入参数类型是字符串型,要是给它传入数组会出现错误,使sha1()函数返回错误,也就是返回false,这样一来===运算符就可以发挥作用了,需要构造username和password既不相等,又同样是数组类型

构造?name[]=1&password[]=12这样可以绕过


8.SESSION验证绕过

$_GET['password'] == $_SESSION['password']//在这个函数中,需要让提交的密码和session这个相等

?password=这样构建并把cookie清空,刚开始我以为isset会把这个空的过滤掉,但虽然是空也没过滤。


9.密码md5比较绕过$pass = md5($_POST[pass]);

$row = mysql_fetch_array($query, MYSQL_ASSOC);

 ($row[pw]) && (!strcasecmp($pass, $row[pw]))//这个就是构建一个数值和它的md5密码值


?user=' union select '202cb962ac59075b964b07152d234b70' #&pass=123


img_734610d0b3e492d5d1875c4be71a6903.png

10.urldecode二次编码绕过

eregi("hackerDJ",$_GET['id']

$_GET[id] = urldecode($_GET['id']);

$_GET[id] == "hackerDJ"

这段代码是首先先匹配输入的值是否和hackerDJ相等,若是不等才可以继续下面的解码再让相等才可以,所以直接其中的一个字母编码两次就可以了。不知道为什么在php代码或者找的网站中都不能编码只能解码,所以看了原题目的wp。。不知道什么原因就是不能编码有点难受。。

http://localhost/php_bug/10.php/?id=%2568ackerDJ

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
php代码审计分段学习(php_bug)[3]
参考:https://github.com/bowu678/php_bugs 21.数字验证正则绕过 0 >= preg_match('/^[[:graph:]]{12,}$/', $password)//输入的内容必须为12个以上,不包括空格和tab...
1179 0
php代码审计分段学习(php_bug)[2]
参考:https://github.com/bowu678/php_bugs 11.sql闭合绕过 $sql = "select user from php where (user='$user') and (pw='$pass')";嗯好吧这个不就是...
1048 0
Window2003 iis+mysql+php环境配置:
1.下载php mysql zend phpmyadmin 建议到这里下载:链接:http://pan.baidu.com/s/1i3xN5Yl 密码:onmn 这个软件包已经包含 php 5.2.17 mysql 5.1.63 zend phpwind 8.7 phpmyadmin 3.5.2 省去大家到各个网站找包的时间。
65 0
PHP面试题:你常用到的mysql命令?
PHP面试题:你常用到的mysql命令?
47 0
PHP连接MySQL 8.0报错的解决办法
PHP连接MySQL 8.0报错的解决办法
140 0
centos下 Apache、php、mysql默认安装路径
apache: 如果采用RPM包安装,安装路径应在 /etc/httpd目录下 apache配置文件:/etc/httpd/conf/httpd.conf Apache模块路径:/usr/sbin/apachectl web目录:/var/www/html 如果采用源代码安装,一般默认安装在/usr/local/apache2目录下 php: 如果采用RPM包安装,安装路
2969 0
php之分页类代码
/* 思路 1.把地址栏的URL获取 2.分析URL中的query部分--就是?后面传参数的部分 3.query部分分析成数组 4.把数组中的page单元,+1,-1,形成2个新的数组 5.再把新数组拼接成query部分,合成上一页,下一页连接地址 */ //分页类 class Page { public $total; //全部条数,从数据库取出 publi
1084 0
PHP 代码片段记录
检查URL是否为图片地址 getimagesize() Function check_img($file) { $x = getimagesize($file); switch ($x['mime']) { case "image/gif": $response = 'this is a gif image.
577 0
+关注
spleated
渗透测试入门的小白一只
71
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载