以下是lmpossible模式代码:
<?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
echo "<pre>{$cmd}</pre>";
}
?>
1、首先肯定是理解内容哈,通过第一行可以看到就是php语言所写,紧接着整个先理解它php语句所表达的意思,如下图所示:
2、整体的一个语句大致意思就是 if 语句的一个判断结果,如果值为true(真),则执行,如果值为flase(假),则不执行,接下来我们就了解里面一些生僻或者翻译不了的函数以及它所能实现的作用,如下图所示:
# isset
# trim
-
函数的意思:去除字符串首尾处的空白字符(或者其它字符)
-
下图中演示是没有函数的显示,左边图可以看到我在编写的时候专门输入了两空格,右边图显然可以看到空格是展示出来的 (在执行完的页面右击查看源代码就可以看到了)
-
下图就是演示有函数的显示了,还是跟上图一样在页面中右击查看源代码,可以看到空格很明显消失了
# array_keys
- 函数的意思:返回数组中的数字或者字符串的键名 (这个不太好理解,那咱们上图看看)
- 第一张图返回了一个索引数组,还是理解的有点模糊,接着上图
-
这第二张明显了吧,通过array_keys这个函数发现返回的值为数组里的键名,让其组成了一个新的数组
# str_replace
-
函数的意思:子字符串替换
-
图中可以清晰的看到就是将传入的值进行对比替换输出得到$str的值
# stristr
# php_uname
以上就是对整个代码中不理解的函数进行多方面的查询得到的结果,查询方式例如:php手册
综上理解后,对整个代码进行审计,如下图所示:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
// 判断从前端通过post方式传来的值是否为空
$target = trim($_REQUEST[ 'ip' ]);
// Set blacklist
// 从请求中获取一个名为 "ip" 的参数,然后使用trim()函数去除该参数值的首尾空格,并将其赋值给变量 $target
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '', //这里的语句就是一个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.
// 先通过array_keys返回以上数组中的键名,紧接着根据键名去找$target中是否有跟键名一样的值,如果有将会在$substitutions数组中的值进行替换
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
// 通俗的理解就是判断是否为Windows系统(stristr忽略大小写)
$cmd = shell_exec( 'ping ' . $target );
// 以上语句成立如果是Windows系统,则利用shell_exec命令执行ping命令
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
// 如果不是Windows系统,则利用shell_exec命令执行ping命令
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
# 个人理解,有不足麻烦指出,感谢各位大佬