DVWA靶场命令注入impossible源码分析详解
DVWA靶场命令注入impossible源码分析详解
tip:部分函数已在DVWA靶场命令注入高级源码分析详解中给出解释,并演示使用方法,在此不再赘述。
1.源码详解
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// 判断用户是否提交了表单
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
//验证表单提交的 CSRF(跨站请求伪造)令牌,确保请求合法。
$target = $_REQUEST[ 'ip' ];
//将前端输入的字符串(变量ip)赋值给$target。
$target = stripslashes( $target );
//将变量target中的反斜杠删除,以便正常显示,配合addslashes() 函数使用,可以理解为转义特殊字符。
$octet = explode( ".", $target );
//将IP 拆分为4个八位字节
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
//用is_numeric函数检查每个八位字节是否为数字,且拆分后的target变量是否由4个八位字节组成。
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// 将拆分后的4个八位字节拼接为IP。
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// 如果返回的操作系统信息为windows系统
$cmd = shell_exec( 'ping ' . $target );
//执行ping命令
}
else {
// 非Windows
$cmd = shell_exec( 'ping -c 4 ' . $target );
//否则,执行非windows系统的ping命令
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
else {
// 如果分割出来的任意八位字符部位非数字,则输出错误信息
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// 生成会话令牌
generateSessionToken();
?>
备注:
1.checkToken() 不是 PHP 内置函数,它是一个自定义函数。通常情况下,checkToken() 函数用于验证表单提交或 URL 请求中的 CSRF(跨站请求伪造)令牌,以确保请求是合法的。CSRF 攻击是一种常见的 Web 安全威胁,攻击者通过在受害者浏览器中注入恶意代码,来模拟用户的请求,从而执行未经授权的操作。
2.stripslashes() 函数用于删除由 addslashes() 函数添加的反斜杠。在 PHP 中,如果我们要将某些数据存储到数据库中,需要对特殊字符进行转义,以防止 SQL 注入攻击。addslashes() 函数就是用来对字符串中的特殊字符进行转义,并在每个特殊字符前添加一个反斜杠。而 stripslashes() 函数则是用来删除这些反斜杠的,使得字符串恢复成原来的形式。通常情况下,在从数据库中读取数据并在页面上显示之前,需要使用 stripslashes() 函数将数据中的反斜杠删除,以便正常显示。
3.generateSessionToken() 是一个自定义函数,用于生成一个随机的会话令牌。在 web 应用程序中,会话令牌是一种用于识别用户身份和验证用户请求的机制。当用户登录后,服务器会为其创建一个唯一的会话 ID,并将其存储在一个称为 session cookie 的小文件中,发送给用户的浏览器。每次用户发起请求时,浏览器都会将 session cookie 发送回服务器,以便服务器可以识别用户并验证其请求。为了防止会话劫持攻击,会话 ID 必须是随机的、不可预测的和唯一的。因此,generateSessionToken() 函数就是用来生成这样的会话令牌的。它通常使用随机数生成算法来生成一个字符串,该字符串包含字母、数字和特殊字符,长度一般为 32 个字符或更长。在生成会话令牌时,需要确保其足够随机、安全且不易被猜测
2.代码涉及函数
函数 | 解释 |
---|---|
stripslashes | 反引用一个引用字符串 |
explode | 使用一个字符串分割另一个字符串 |
is_numeric | 检测变量是否为数字或数字字符串 |
sizeof | sizeof — count()的别名,统计数组、Countable对象中所有元素的数量 |
3.函数使用演示
(1).stripslashes()
<?php
$str = "Is your name O\'reilly?";
// 输出: Is your name O\'reilly?
echo ($str);echo "<br />";
// 输出: Is your name O'reilly?
echo stripslashes($str);
//返回一个去除转义反斜线后的字符串(\' 转换为 ' ),若是双反斜线(\\)被转换为单个反斜线(\)。
//总结:就是去掉1个\
?>
说明
stripslashes($string);
反引用一个引用字符串。
如果不需要将数据插入到一个需要转义的位置(例如数据库)则可以使用 stripslashes()。例如,直接从 HTML 表单输出数据
(2).explode()
<?php
// 示例 1
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; echo "<br />";// piece1
echo $pieces[1]; // piece2
?>
说明
explode($separator, $string);
此函数返回由字符串组成的数组,每个元素都是string
的一个子串,它们被字符串separator
作为边界点分割出来。
(3).is_numeric()
$tests = [
" 42",
"42 ",
"\u{A0}9001", // non-breaking space
"9001\u{A0}", // non-breaking space
];
foreach ($tests as $element) {
if (is_numeric($element)) {
echo var_export($element, true) . " is numeric", PHP_EOL;echo "<br />";
} else {
echo var_export($element, true) . " is NOT numeric", PHP_EOL;echo "<br />";
}
}
?>
说明
is_numeric($value)
检测指定的变量是否为数字或数字字符串。
补充:var_export — 输出或返回变量的可解析字符串表示
var_export($value, $return);
value 想要输出的变量名。
return 此参数为 true 时,var_export() 将返回一个变量,而不是输出
var_export() 函数返回关于传递给该函数的变量的结构信息,它和 [var_dump()] 函数类似,不同的是其返回的表示是合法的 PHP 代码。
(4).count()
<?php
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
var_dump(count($a));
?>
说明
count($value);
value 数组。
用于数组时,统计数组中元素的数量。
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录