0x00 写在前面
从零学习php,最终目的实现代码审计入门,软件采用sublime text,环境使用phpstudy搭建,数据库是navicat,需要有基本的前端基础、简单的php+mysql后端基础、渗透知识和漏洞原理,文章跟随流沙前辈学习记录,看看曾经遥不可及的代码审计能不能慢慢啃下来。
本章为代码审计入门第六篇-DVWA靶场篇,对DVWA靶场漏洞进行代码审计。
0x01 常用的命令连接符
Windows下常用的命令连接符
&,以test、whoami、dir命令测试
1.前面为假,执行后面命令
2.前面为真,前后命令都执行
通俗解释: 前面命令执行后接着去执行后面命令
&&,以test、whoami、dir命令测试
1.前面为假,前后都不执行命令
2.前面为真,前后都执行命令
通俗解释:前面命令执行成功了才会去执行后面命令。
| 和 || ,以ping和whoami为例
| ,浅浅的讲:直接执行后面命令
|| ,前面为假才执行后面命令
Linux下常用的命令连接符和windows一致,唯一区别的是 ; 的使用,;的作用连接多条命令,每条命令都执行这里以vps为例。
常用的命令连接符就差不多了,还有一个常用的但不是命令连接符的东东,基本就这么多。
> 写入并覆盖
>> 追加
0x02 Command Injection
命令注入模块,注释写在代码里,尽量用详细的语言描述代码含义。
level-low
命令执行,但没有作任何限制
low.php
<?php
if( isset( $_POST[ 'Submit' ] ) ) { //isset函数检测变量非空
// 判断post过来的数据是否被提交过来
// Get input
$target = $_REQUEST[ 'ip' ];
// 得到接收的'ip'赋值给变量$target
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// php_uname 返回运行 PHP 的系统的有关信息 (mode:'s') 返回操作系统
$cmd = shell_exec( 'ping ' . $target );
// Windows 系统 ,用 shell_exec 运行拼接命令 ping.$target,例如ping 127.0.0.1
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
// Linux系统,shell_exec 运行拼接命令 ping -c 4.$target,原因是linux下如果不指定ping次数会一直ping下去
}
// Feedback for the end user
// 输出操作命令后的结果
$html .= "<pre>{$cmd}</pre>";
}
?>
level-medium
相比于low,增加一个黑名单机制
medium.php
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);
//可以理解为把 && 和 ; 设为一个黑名单
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// 用str_replace对变量 $target 过滤,匹配到黑名单里的 && 和 ; 会过滤
// 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>";
}
?>
level-high
相比于medium,黑名单内容增加
high.php
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '', //注意此处过滤有空格,过滤的是|空格
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
//设置黑名单 & ; | - $ ( ) ` ||
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// 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>";
}
?>
level-impossible
既然是impossibale,那以咱水平肯定绕不过去,直接看代码。这里先把 $target 输出,看看代码是如何防止命令注入的。
impossiable.php
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
//检测token
// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
//接收数据,使用stripslashes防注入
// Split the IP into 4 octects
$octet = explode( ".", $target );
var_dump($octet); // --调试--
exit();
// explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
// 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.
// 先拆为数组,分别为0、1、2、3、4,is_numeric检测是否为数字,也就是说在这里数组0、1、2、3、4都必须为数字
$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();
?>
调试也可以看出上面代码的数组分组
这里虽然没用禁用所谓的危险函数shell_exec,但对于用户的输入内容过滤严格从而避免命令注入漏洞。
0x03 总结
沙雕考试暂且结束,暂获一周躺平权。