什么是代码执行
用户输入的数据会被当做后端代码进行执行。
一句话木马的本质:代码执行漏洞
<?php eval($_REQUEST["chopper"])?>
代码执行与命令执行的区别
-
代码执行:用户输入的数据被当后端代码执行 (后端代码可以调用系统函数)
eg:var_dump() ,$_SERVER
-
命令执行:用户输入的数据被当系统命令执行(系统命令也可以写文件产生webshell)
eg:cmd ,bash
原理
由于开发人员编写源码,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中WEB服务器没有过滤类似system(),eval(),exec()等函数是该漏洞攻击成功的最主要原因。
产生原因
-
使用命令执行、代码执行函数调取外部应用、执行系统命令
-
参数用户可控
-
未对用户输入进行过滤、转义和限制
常见危险函数介绍
-
eval($a):将字符串当做后端代码执行,且可以多行。
disable_function :禁用函数(用来做防护),在php.ini可以添加需要禁用的函数,但eval()不受影响,所以有eval不是函数的一种说法,属于php的一种特殊写法。
-
assert($a):将字符串当做后端代码执行,只能执行单行。
多行执行可以写入文件在执行
file_put_contents('1.php','')
注意:菜刀用assert来调用eval,即assert('eval()')。
-
preg_replace():正则替换函数(替换必须真实发生才会触发函数,不发生替换,不会触发)
/e模式的作用是将替换串中的内容当作代码来执行,php语言才有。 preg_replace()使用了 /e 模式,会导致可以代码执行 eg: //匹配不到不会触发,且会报错 // /e会有个固定报错 //匹配到发生替换正常执行
-
create_function():匿名函数
eg:$a = create_function('$id','echo $id;'); 调用时用a()即可 create_function('',$_REQUEST[8]);// 传参: 8=}phpinfo();// 实际执行代码闭合了前面的{,注释掉后面的},中间执行恶意代码
-
$_GET[1]($_GET[2])
:有括号传参大概率都可作为代码执行传参:1=assert&2=phpinfo();
-
array_map(要调用的函数,传参):回调函数
一句话木马: array_map('assert',array($_POST['c'])); array_map($_REQUEST['b'],array($_REQUEST['c'])); //注意:eval不是函数无法被调用,可以选择assert('eval()')
call_user_func() 也可回调
-
"${phpinfo()}":字符串二次解析(PHP版本5.5及其以上版本可以使用)
如果字符串是包围在双引号(")中,PHP会对其特殊解析。
漏洞危害
- 继承web应用权限执行系统命令、读写文件。
- 反弹shell
- 控制服务器
- 攻击内网
靶场练习
靶场为DouPHP的cms系统,我们通过安装的方法来拿shell。
DouPHP在安装时会生成配置文件,通过特殊输入,来形成代码执行。
由于一般不出现安装界面,所以我们可以通过删除已安装的配置文件造成重装。
安装完一般会有xx.lock或者lock.xx的安装锁定文件,删除它即可重装。
1.我们在本地安装DouPHP,
2.发现在data目录下多了一个install.lock和config.php
3.访问install会提示我被锁定
4.删除install.lock访问网站已经需要重新安装
5.现在去线上靶场后台,下面是审计过程在代码中找到可以删除移动端logo的一个模块,看是否能够删除install.lock
6.登陆后台来到删除logo的地方
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tSdctCA-1668436877158)(https://s2.loli.net/2022/01/04/SPMBYWD57RE6INf.png)]
7.抓包看到删除logo的文件名
8.代码中发现mobile_logo是post传参
9.post传参我们删除filename,直接在下面传要删除的文件目录即可
10.抵达目标文件后点击删除
11.删除完毕,自动跳转到了安装界面
12.在数据库帐号处输入代码,提交在config.php中生成恶意代码。
13.config.php已经生成
14.木马连接成功,拿到flag