Day_1_Command Injection
第一天
7.8
今天我们的主要研究对象是建立靶机DVWA的过程,以及关于Command Injection漏洞的基本原理,使用的是Windows11系统。
0x00 建立DVWA靶机的踩坑过程
1. 注意一开始百度到的材料大部分正确,先下载PHPstudy,顺序安装,(小皮面板最后安装的时自定义安装在D盘),然后下载DVWA的压缩包,这里放一个帖子可以参考,现找也行;
之后就是遇到标红的问题如何解决,大多数情况是只需要根据DVWA靶机创建页面的提示更改php.ini(php文件中)即可,但是如果遇到类似关于 MySQL/MariaDB ,同时表示该用户无法访问此数据库的时候,就不能只依靠最初root数据库与用户名,在config.inc.php文件中改变用户名、用户密码、以及KEY的同时,注意PHP study上创建新的数据库,同时确保数据库名与用户名的相互统一。
2. 确保下载的压缩包中内容齐全,确保每个题目,low,medium,high,impossible等版本的PHP文件的齐全。
3. 遇到输出乱码问题,可以将相应的输出由“utf-8”改为“gbk”。
具体流程在配套的PDF文件中
0x01 Command Injection主要考察内容
主要分为low,medium,high三种难度,基本都很简单:low-level下源码没有任何的过滤情况;medium-level下源码只过滤了“&&”(以及Unix系统下的“;”);high-level源码过滤较多,但仍可以通过“|”进行输入
重点
1. 因为源码中的shell_exec(),是一种通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回的函数,因此外部输入跟命令行没有区别,会使php程序陷入危险的环境中。
2. 关于命令连接符“&&” “||” “|” “&” 的应用
a&&b :代表首先执行前者命令a再执行后命令b,但是前提条件是命令a执行正确才会执行命令b,在a执行失败的情况下不会执行b命令。所以又被称为短路运算符。
前面的指令执行正确,后面的指令才能继续执行
a&b :代表首先执行命令a再执行命令b,如果a执行失败,还是会继续执行命令b。也就是说命令b的执行不会受到命令a的干扰。
简单拼接,前后的指令互不影响
a||b :代表首先执行a命令再执行b命令,如果a命令执行成功,就不会执行b命令,相反,如果a命令执行不成功,就会执行b命令。
只有前面的指令执行失败,后面的指令才可以执行
a|b :代表首先执行a命令,再执行b命令,不管a命令成功与否,都会去执行b命令。
第一条失败仍会执行第二条,a的输出作为b的输入
*可以参考文章
3. 关于impossible情况下的源码安全的原因
源码如下:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$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' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}
else {
// Ops. Let the user name theres a mistake
$html .= '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
源码安全性高的原因是采用了几个更为严格的函数规范输入的形式:
stripslashes() :删除反斜杠,便于避免Linux系统通过反斜杠进行转义。
explode() :将输入打散,分成不同的数字。
is_numeric :用来判断分成不同份的数组是否是全为数字。
由此严格的限制输入必须是:数字.数字.数字.数字
重点总结:命令连接符的功能