php代码审计学习笔记1

Posted by 跳跳龙 on September 16, 2019

(文章版权归笔者跳跳龙所有,谢绝转载)

之前clone了php_bugs项目,记录一下学习的过程。题目中关于mysql相关的不记录,这个得配置好每个人的数据库和数据源。

1.extract的变量覆盖

直接利用extract把flag变量覆盖成空了。

2.trim和is_numeric差异

这道题主要是在php5下is_numeric()和trim()针对的字符是不同而造成的。下面源码中,is_numeric()针对的是’ ‘(空格),’\t’,’\r’,’\n’,’\v’,’\f’这6个。当is_numeric()遇到这6个是不受影响的,从代码中的length–就能看的出来。

php5下

而trim会过滤’ ‘(空格),’\t’,’\n’,’\r’,’\v’,’\0’这6个,会发现和上面相比差了一个\f(%0c)。

所以 %00%0c121会被is_numeric返回false。

而经过trim函数执行后,会过滤掉%00而%0c不会过滤,因为trim源码中过滤的6个字符没有%0c也就是没有”\f”。所以会变成”\f121” 这个”\f121”刚好绕过is_palindrome_number函数。

is_numeric源码:

trim源码:

5.ereg的00截断

php中的ereg函数存在%00截断。就是说字符串当遇到%00时,边认为这个字符串结束了。 eg: “abcdefg%00123456”就按照”abcdefg”来处理。 php中的科学计数法来进行长度绕过 1e10代表1后面10个0。 所以payload为”1e10%00*-*“遇见ereg函数时当做”1e10”来处理,正好满足正则表达式的要求

6.strcmp函数内部异常返回null

strcmp函数比较字符串相等时返回0。 但是比较时发生错误或者异常的时候返回null。

但是null和0在”==”弱比较的情况下是相等的。 所以payload为 06.php?a[]=s

7.sha()比较

这个问题的本质还是php的比较问题,但是这里是”===”。 关于php的弱比较安全客上有一篇总结,请参考:http://bobao.360.cn/learning/detail/2924.html 但是关于这道题目采用的是类型比较绕过。

php的很多函数在处理数据是遇到错误会依旧有返回值。比如sha1()返回null

所以payload为 http://127.0.0.1:8888/test/07.php?name[]=a&password[]=b

8.session 比较问题

构造一个弱比较

password传为空即可

10.二次编码

服务器是默认会帮我们结解一次码的。 输入 http://127.0.0.1:8888/test/10.php?id=%2568ackerDJ 在代码中可以看到%25已经变成%号了。 这样再经过url解码一次就正好绕过了前面的正则匹配。

12.XFF设置ip

直接设置XFF即可。另外我也曾简单过有些业务代码就按照此方式来校验白名单!

13.md5比较问题

参考安全客关于php弱比较的总结 http://bobao.360.cn/learning/detail/2924.html