Fork me on GitHub

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 :用来判断分成不同份的数组是否是全为数字。

由此严格的限制输入必须是:数字.数字.数字.数字

重点总结:命令连接符的功能

posted @ 2024-07-11 15:23  .u.i.c  阅读(12)  评论(0编辑  收藏  举报