php代码审计

extract变量覆盖

6qYrHFz.png

第二行的$flag我们是不知道的。

第三行对于get方式获得的值进行了extract()函数处理。

第六行,对$flag进行了读取并且用trim函数移除了左右两侧并且赋值给content。

第七行判断通过get得到的shiyan值是不是和content相等。

我们一开始就不知道$flag的值,怎么构造shiyan的值和它相等?

对extract()函数进行分析。

4LdwYhr.png
extract()函数引入变量,当冲突的时候,会引入新的变量,意思也就是覆盖原来的变量

题目中对于get方式得到的值进行了extract(),我们再构造一个flag不就可以覆盖掉原来的flag了吗?

一开始我构造的是?shiyan=1&flag=1,但是是错误的。这里就理解错了覆盖这个含义了。

图片上写的很清楚了,数组中有同名元素的时候,会覆盖,那么元素不同的时候呢?我只让flag=1,其他的变量就没有了吗?

所以直接构造?shiyan=&flag=,直接让他变为空。这样就不用管flag里其他的元素是什么了。

 `   第二种解法,如果php://可以用的话,直接POST重新写flag的值,并且保证a和falg的相等就可以。`  

url二次编码绕过

CZiuKB0.png
①eregi()判断get方式获取到的id值是否和hackerDJ相等。做完这题目发现并没有关这个函数什么事。

②绕过eregi()我先尝试了把hackerDJ进行url编码,但是没有卵用,浏览器会自动给你进行url解码。

③然后看第二段内容,对url再进行一次解码,不懂为什么这么做,就是因为这个urldecode才导致了这次绕过。

④我们对hackerDJ进行两次url编码,变为%25%36%38%25%36%31%25%36%33%25%36%42%25%36%35%25%37%32%25%34%34%25%34%41
我们再来从头看代码。

⑤浏览器首先对 %25%36%38%25%36%31%25%36%33%25%36%42%25%36%35%25%37%32%25%34%34%25%34%41进行url解码,变为%68%61%63%6B%65%72%44%4A,这串字符相当于hackerDJ进行了一次url编码。hackerDJ和%68%61%63%6B%65%72%44%4A相比,不相等,所以可以绕过第一次的eregi()函数。

⑥来到第二部分代码,对id又进行一次解码,直接变为hackerDJ。这下子就绕过了。

⑦主要还是觉得那个urldecode()函数的问题吧,没有这个函数就不会发生绕过。

数组返回NULL绕过

29C2MaO.png

思路一:eregi的00截断,构造?password=a%00--
思路二:构造数组。ereg和strpos是对字符串进行操作,如果是数组,他就会返回null。
?password[]=a

弱类型整数大小比较绕过

TUWuZ2n.png

is_numeric 判断是不是数字字符串,构造?password=1337a,即可绕过is_numeric函数。后边的弱类型比较,1337a和整数比较, 1337a会转化为1337,大于1336,绕过、

?password[]=,也可以绕过,不知道数组和整数进行弱类型比较的时候具体是怎么回事,百度也没搜到,自己试了几个数,猜测数组永远大于整数。

?password=1337%00,或者?password=1337%20,这是函数is_numeruc()本身的漏洞。弱类型比较,这两个都花转化为整数1337.

十六进制与数字比较

A7pJEEX.png

首先get方式得到的值赋值给$temp,将这个变量代入函数。

来看这个函数:
flag的值我们一开始是不知道的,这个是需要求的。

$one和$nine是获取数字1和9的ascii的值。这个会在后边的判断用到。

number是数字字符串 。

然后执行一个循环,判断你的输入是不是整数 。
我们来举个例子:?password=3735929054
$dight在每次循环挨次存入3735929054的每一位数,然后顺序和数字字符串中的每一个数比较。

详细说一下过程,get得到3735929054,然后把第一个整数3存入dight,3在于1~9之间,字节return false,退出循环。

这样肯定不行的,无论怎么都会出现0~9的数字,只要有0~9数字,一定会输出false.

题目说了,16进制,我们先看下3735929054的十六进制是什么?
0xdeadc0de,这个没有数字0~9,是不是可以绕过呢?后边还有个if判断,必须是number和password的值相等。十进制和十六进制比较的时候,强弱比较类型是没有关系的。构造?password=0xdeadc0de.

这一定会绕过吗?纯是运气好,我们那串十进制数字转化为16进制刚好没有0~9。举个例子:如果字符串是912082呢?十六进制为0xdead2,当比较到最后一位时数字是2,在0~9,return false。

ereg正则%00截断

YZP3Clu.png

题目要求:get方式获取到password的值,这个password必须是a-z,A-Z,0-9,说白了就是英文字母加数字。
但是还得要求里面含有"-"这个字符。另外一个就是,要求输入password小于八位还得大于99999999,这里采用科学计数法。

%00截断和科学计数法绕过

①怎么绕过ereg,题目要求有-,所以可以构造?password=123%00-
②绕过长度限制,科学计数法,1e8就代表着100000000,大于99999999因此?password=1e8%00-
③这里有个问题啊,可能bugku表面的代码不和实际的代码一个样子,-实际上应该是*-* ,并且他错误提示也是给你提示*-*没有找到,猜测这里应该是某种文本编辑器把两个*作为控制字符了吧。

j8BzBiD.png
值得一提的是,%00只代表一个字符。

数组绕过

?password[]=

首先,ereg函数判断数组时候会返回null,null和false进行强类型比较(===)的时候是不相等的。所以绕过了ereg函数。
strpos比较数组也会返回null,原理和ereg一样,所以直接就绕过了。

转载于:https://www.cnblogs.com/zaqzzz/p/9606295.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值