show me you smile

来源:互联网 发布:公网ip绑定域名 nginx 编辑:程序博客网 时间:2024/04/28 13:17

地址:
http://hackinglab.cn/ShowQues.php?type=scripts
参考:
https://www.waitalone.cn/security-scripts-game.html
验证咋一看有两处逻辑矛盾。
1. $_GET数组本身提取自$_SERVER['QUERY_STRING'],而$_GET['^_^']中的key包含_符号,而$_SERVER['QUERY_STRING']却不允许。
2. file_exists需要寻找的文件必须不存在,但file_get_content却能读到文件内容。

绕过1可以通过将^_^修改为^.^,服务器端PHP会自动将.改为_。然而当我请求这样的url的时候,

http://localhost/~caiqiqi/lab1.xseclab.com/?^.^=flag.php

却被preg_match/\./给挡住了。
该参考给出的思路:
1. 当.或者[]之类的符号作为参数的key的时候,会被PHP改写为_,但由于$_SERVER['QUERY_STRING']为用户提交的内容,所以不被修改。参考:http://ca.php.net/variables.external。
2. file_get_content可以获取远程数据,但常用网络协议都已经被正则过滤,因此需要选取其他协议。查阅PHP支持的协议和包装,发现RFC 2397的data协议可用。巧合的是,file_exists对于data指向的内容判断为不存在。

于是可以构造这样的url
http://lab1.xseclab.com/base13_ead1b12e47ec7cc5390303831b779d47/index.php?^.^=data://text/plain;charset=unicode, (●'◡'●)
//之前将unicode和(●’◡’●)之间的,看成了空格,于是没能得到正确响应。