【代码审计】PHP代码审计之CTF系列(1)
优采云 发布时间: 2022-06-20 01:27【代码审计】PHP代码审计之CTF系列(1)
声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
采用github yaofeifly师傅的PHP练习,链接:。每个内容均采用docker。部署过程:进入对应的docker_env,使用
docker-compose builddocker-compose up -d
进入对应docker进程,查看地址访问即可。
challenge 1
访问地址,发现源码
1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY=
即可得到
补充:
bin2hex() 函数把 ASCII 字符的字符串转换为十六进制值。<br />strrev() 函数反转字符串。<br />hex2bin() 函数把十六进制值的字符串转换为 ASCII 字符。
challenge 2
题目内容:
得出结果:
补充:
1、当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含’.',’e',’E'并且其数值值在整形的范围之内,该字符串被当作int来取值。其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
2、在进行比较运算时,如果遇到了0e这类字符串,PHP会将它解析为科学计数法。(也就是说只靠最前面的进行判断)
3、在进行比较运算时,如果遇到了0x这类字符串,PHP会将它解析为十六进制。
challenge 3
题目内容:
访问后发现没有什么内容,查看一下源码。
发现存在challenge3.txt文件,尝试访问。
发现源码
<br />
stripos()
stripos()函数:查找字符串在另一字符串中第一次出现的位置(不区分大小写)
strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写)
strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
stripos()函数返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。字符串位置从 0 开始,不是从 1 开始。
file_get_contents()
file_get_contents()函数:把整个文件读入一个字符串中,加上@是屏蔽对应的错误
PHP中fopen,file_get_contents,curl函数的区别:
1、fopen/file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。
2、fopen /file_get_contents 在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。
3、fopen / file_get_contents 函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
4、curl 可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。
eregi()
eregi()函数:在一个字符串中搜索指定的模式的字符串,搜索不区分大小写。eregi()可以特别有用的检查有效字符串,如密码。
题目
观察完代码后发现为php弱类型绕过。
首先a,进行POST传递。
当data可以通过php://input来接受post数据。
$id传一个字符进去,会被转化为0。
对于b的第一个字符与'111'拼接,和'1114'进行对比)和首字符不为4。
可以设置$b为111111,这样,substr()会发生截断,在匹配时进行eregi('111','1114')满足,同时不会对strlen()造成影响。
构造payload:
?id=a&a=php://input&b=1111111112 is a nice lab!
challenge4
打开后发现源码
<p>