代码审计
打开dvwa靶场,先把难度调到high,在点击“Command injection”进入命令执行漏洞靶场
查看代码
<?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.trim
1.含义:
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
功能除去字符串开头和末尾的空格或其他字符。函数执行成功时返回删除了string字符串首部和尾部空格的字符串,
2.发生错误时返回空字符串()。如果任何参数的值为NULL,Trim() 函数返回NULL。
3.在Java中,使用Trim函数需要调用String类的trim()方法。
4.该方法会返回一个新的字符串,并且会去掉原字符串开头和结尾的空格、回车、换行符等不可见字符。
5.调用方式:string.trim()
6.trim是一个去字符串空格的方法,返回的是一个新的字符串。
7.trim不需要传参,直接是对当前调用对象进行处理,二是需要一个返回值,函数里面的this指的就是调用对象,因此不需要进行传参。
var str = " Hello World! ";
console.log("原字符串: ", str);
str = str.trim();
console.log("删除两侧空格后: ", str);
这段代码首先定义了一个包含两侧空格的字符串。然后我们调用了trim()函数来删除这个字符串两侧的空格,并将结果存储回原来的变量中。最后,我们在控制台打印出原字符串和删除两侧空格后的字符串。
2.str_replace
str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。规则:
1)如果搜索的字符串是数组,那么它将返回数组。
2)如果搜索的字符串是数组,那么它将对数组中的每个元素进行查找和替换。
3)如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换
4)如果查找的是数组,而替换的是字符串,那么替代字符串将对所有查找到的值起作用。
语法:str_replace(find,replace,string,count)。其中,count:对替换数进行计数的变量。
<?php
// 定义原始字符串和要替换的子串
$original_string = "Hello, world!";
$search_for = "world";
$replace_with = "Dolly";
// 使用str_replace()函数进行替换
$new_string = str_replace($search_for, $replace_with, $original_string);
// 打印出新字符串
echo $new_string;
?>
这段代码首先定义了一个原始字符串和两个要替换的子串。然后我们调用了str_replace()函数,将原始字符串中的“world”替换成“Dolly”,并将结果存储到新的变量中。最后,我们在页面上打印出新的字符串。
3.array_keys
array_keys是一个PHP内置函数,用于获取数组中所有的键名。它的基本语法如下:
array_keys(array)
其中,array是要从中获取键名的数组。该函数会返回一个新的数组,其中包含了输入数组中所有键名的值。如果没有提供任何参数,则返回NULL。
<?php
// 定义一个数组
$array = array(
"name" => "John",
"age" => 30,
"city" => "New York"
);
// 获取数组中所有的键名
$key_names = array_keys($array);
// 打印出键名
print_r($key_names);
?>
这段代码首先定义了一个包含多个元素的数组。然后我们调用了array_keys()函数,获取这个数组中所有的键名,并将结果存储到一个新的数组中。最后,我们在页面上打印出这个新的数组,可以看到它包含了原始数组中的所有键名。
4.stristr
stristr是一个PHP内置函数,用于在字符串中搜索指定的子字符串,忽略大小写,并返回找到的第一个子字符串及其后面的字符串。它的基本语法如下:
stristr(string,substring,start)
其中,string是要搜索的原始字符串,substring是要查找的子字符串,start是开始搜索的位置,默认为0。
<?php
// 定义原始字符串和要搜索的子串
$original_string = "Hello, world!";
$search_for = "world";
// 使用stristr()函数进行搜索
$found_string = stristr($original_string, $search_for);
// 打印出找到的子串
echo $found_string;
?>
这段代码首先定义了一个原始字符串和要搜索的子串。然后我们调用了stristr()函数,从原始字符串中搜索子串,并将找到的部分存储到新的变量中。最后,我们在页面上打印出找到的子串。 你可以尝试运行这段代码,看看输出的结果是否符合预期。
5.php_uname
php_uname是一个PHP内置函数,用于获取运行PHP的系统的详细信息。它的基本语法如下:
php_uname([mode])
其中,mode是一个可选参数,用来指定要返回哪种类型的系统信息。如果不提供该参数,函数将返回所有可用的信息;否则,mode应该是一个单个字符,指定要返回的信息类别,具体取决于不同的操作系统。
<?php
// 调用php_uname()函数获取系统信息
$system_info = php_uname();
// 打印出系统信息
echo $system_info;
?>
这段代码首先调用了php_uname()函数,获取了运行PHP的系统的详细信息,并将结果存储到了一个新的变量中。然后,我们在页面上打印出了这个变量,可以看到它包含了系统类型、版本号、主机名等信息。