代码执行漏洞(代码审计的思路)

零、 开局上表演

安装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(如日志文件),

	这个时候,我们就可以通过闭合将原本的日志文件改成我们的一句话。

核心:用户可操作的数据被写入危险后缀文件。

猜你喜欢

转载自blog.csdn.net/weixin_43970718/article/details/115258481
今日推荐