代码执行:用户输入的数据被当做后端代码执行
一句话木马就是代码执行。
RCE:远程的命令或者代码执行,特指远程的。
现在一般渗透的最终情况可以实现执行命令或者是代码都属于RCE。
学习代码审计:1、学思路(通读全文,危险函数定位) 2、学函数
函数:
1、eval,最常见,并且可以多行执行:eval(‘echo 1;phpinfo()’)就可以输出1和phpinfo。
2、assert(),效果与eval相同,但只能执行单行数据。
想让assert多行执行:1.assert(eval(xxx))此处eval代指能多行执行的命令。2.file_put_contents(‘1.php’,’echo 1;echo 2;’)//写成1.PHP文件,文件里写多行命令,然后访问它。
3、preg_replace(‘/a/e’,$_REQUEST[],’abc’); 正则的/e是替换要替换的值并代码执行。
注意对于preg_replace(1,2,3)是把3里的正则后的1变成2并执行2,但是如果3里没法匹配到1的任何值,那么久没办法执行。(此处1是表达式)
这个也是单行执行。
4、create_function()
$a=create_function(‘$id’,’echo $id;’);这句话就是临时创造函数,传参时$id,执行过程是echo $id。$a(5)就是传参5输出5。
这里是可以执行多行的。
这里如果是$a=create_cuntion(‘$id’,$_REQUEST[8]);那么传参就可以是8=}phpinfo();//,这里由于函数体虽然是create_function但本质还是大括号那种,所以用大括号闭合,写语句在闭合后的外面就可以执行了,最后的注释为了注释掉函数体本身的闭合大括号。
5、array_map(要调入的函数,要传入的值)(传入是数组,就是把数组里每一个都调用)
注意eval不是函数,是PHP特殊写法,不能调用。
比如array_map(‘assert’,$_REQUEST[])就执行了,当然回调函数不止这一个,还有别的不少,其他语言也有。
6、双引号二次解析(5.6以上版本)
由于单引号会直接用字符,而双引号对如果是变量的东西会解析再用。
“${phpinfo()}”,只要有这一行(改phpinfo为一句马即可),就是有马了。
所以需要原文件中有这么一行东西。
安装网站时填入的数据库账号密码一般都会存在配置文件里
网站都会有配置文件(不同的cms是不同的路径,可以在本地安装目标网站的cms尝试一手)
CMS安装成功会生成锁文件,防止重新安装,一般锁文件是*.lock
如果把锁删了,重新安装,把MySQL用户名写成${phpinfo()};//就有马了。(虽然账户密码不对,但是有马了)
unlink是删除文件函数
直接审计代码找可以用的unlink把锁文件删了。
有个删除logo,根据源码改数据库里的logo.jpg改成锁文件install.lock路径即可。
搜索源码,找哪里用过数据库,找到update。改它来改数据库
更改系统设置事会触发这个update
总思路如下:
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.