代码注入漏洞 为什么会出现代码注入漏洞?

溢出漏洞利用,是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束进行攻击行为。本文以实例详细说明溢出漏洞的利用过程,感兴趣的朋友们来动手操作一把吧!

溢出漏洞利用,是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束进行攻击行为。

下面以栈布局说明溢出漏洞利用过程。

RBP : 栈基地址寄存器,指向栈底地址;

RSP : 栈顶寄存器,指向栈顶地址;

RIP:指令地址寄存器,指向指令所在地址。

函数调用时,当前函数的下一个执行命令入栈(RIP,即RET返回地址),RBP入栈,然后把当前RSP的值给RBP;

RSP根据函数执行而移动,根据空间需要移动所指位置,例如入栈局部变量,RSP的值会跟着减小,保证RSP一直指向栈顶。

栈上的内容填充是从低地址向高地址填充的。

请注意,我们开始使坏啦:
2)RET返回地址指向var1地址(0x7fffffffdee8),var1里面有我们精心制造的字符串,说白了,有我们的恶意代码;
3)被调用函数执行返回命令时,会读取RET返回地址,便会读取var1里面的恶意代码,并进行执行,无意中执行了恶意代码。

也就是,通过缓冲区溢出,我们能改变程序原有的执行流程,去执行我们准备好的代码。
直观示意请见下面的溢出栈布局图:

二、存有溢出漏洞的代码

代码很简单,可以看到这段代码用了危险函数strcpy!!


注意后面两个参数必须要加上,要不然,后续的漏洞利用会比较麻烦,这两个参数是关闭linux系统的堆栈溢出保护机制。
-z execstack:表示允许栈中存放可执行代码;
-fno-stack-protector:表示关闭堆栈保护机制,可以任意覆盖RIP的值,如果编译没有加上这个参数,程序执行过程会进行值(被称为金丝雀值)校验,看RIP是否被篡改了,如果篡改了,说明发生了栈溢出,会调用__stack_chk_fail函数,进行安全退出并丢出一个错误。
我们这次是为了研究溢出漏洞利用的流程和原理,不是进行高级漏洞挖掘研究,所以,先关闭系统本身的保护机制。


字符串过长,程序崩溃了。

三、GDB下的漏洞利用执行

  • 设定断点后,执行查看寄存器内容和栈内容
  • 继续执行,填充288个B字符后的栈内容情况
  • 继续执行,strcpy执行完毕返回,查看寄存器和栈内容,可以看到rbp被覆盖了,但是rip并没有被覆盖,从栈中可以看出,是尝试把0x4242赋值给rip,然而linux 64位系统的rip最大值是0x00007fffffffffff,因而,rip控制失败。


  • 调整输入字符串,再次尝试控制RIP

基于我们不断探索的精神,我们继续尝试,把RIP指向缓存起始地址,即我们可以控制内容的地方。构造字符串:”B” * 264 + “\x7f\xff\xff\xff\xdc\x40″(反序),因为是小端模式,因此内存地址需要反序。
OK,目前为止,我们已经可以控制RIP指向我们的缓存空间了,下一步就是把shellcode注入到我们的缓存空间中,见下面小节。

Shellcode是一串机器可以直接识别的操作码,一般短小精悍,可以实现很多关键功能,是溢出漏洞利用的完美搭档。

当然,也可以直接从网上找现成的使用。

推荐个网站:,里面有各种操作系统的各种shellcode代码,可以用来研究学习。

攻击者可以利用shellcode实现不同的攻击用途。

例如:可以实现蠕虫木马的下载;可以打开被沦陷系统的端口,以便接收C&C控制服务器的指令;也可以提权运行系统的命令行shell;以及获取系统关键资料文件等等。

我们这次用shellcode实现对系统的关键文件(/etc/passwd)的读取。

四、实际环境下的漏洞利用执行

  • 实际环境执行gdb调试好的字符串参数

检查打印信息,我们会发现缓存地址变化非常随机,无法提前预知,就算咱们有NOP缓冲区也失效了。


这正是linux的另一种保护机制,通过地址随机化,防止溢出利用攻击。

那先关闭这个机制,再次验证。

在这个小节,我们自己编写个溢出漏洞利用样本,并进行漏洞利用攻击。

  • 申请缓存存储空间,并在其中输入我们期望的内容(NOP段+shellcode+填充内容+返回地址),填充内容是为了构造合适的字符串长度,保证栈上返回地址内容被覆盖成我们期望的返回地址。
  • 调用我们之前编译好的有漏洞程序victim。

一点小提醒:为了防止内存泄漏,malloc分配的空间使用完毕要记得释放,对应的指针也要置为NULL,防止指针误用。

  • 溢出漏洞利用程序编译运行


直接运行发现出问题了,不能正常执行!

查看打印信息,可得知我们用的返回地址(0x7fffffffde60)跟缓存的起始地址(0x7fffffffdc80)差距很大,因而程序不能进入shellcode代码区正常执行。

  • 调整返回地址偏差,继续运行样本

对比返回地址(0x7fffffffdc9c)和缓存起始地址(0x7fffffffdc80),可以发现两者并不一致,返回地址是在缓存起始地址之后,但也正常执行了。

原因很简单,因为我们在缓存里面填充了很多NOP作为缓冲,返回地址只要落在NOP缓冲区任何一个地方,都能下滑到shellcode代码区进行正常运行。

可能有人会问,都能看到缓存起始地址了,干嘛还折腾用rsp预估返回地址呢,多麻烦呀?

大家可以想想实际情况,应该没有哪个应用程序会主动暴露缓存起始地址(我们的漏洞程序纯粹为了调试,把缓存的起始地址给打印出来了),因而需要一个参考地址进行预估返回地址是多少,所以我们就用了rsp值作为参考地址。

我们已经了解了溢出漏洞利用原理,下面我们开始看看针对这种漏洞的检测原理。

目前比较常用的主要有三种:基于漏洞特征检测、基于Exploit特征检测、基于攻击特征检测。
1)基于漏洞特征检测:对漏洞攻击手段和技术细节比较了解后,研究其触发攻击的必要条件,可以分析出其对应的识别规则,例如缓存区溢出检测、目录遍历检测、远程命令注入检测、远程文件包含检测等;
2)基于Exploit特征检测:从漏洞利用程序中分析独特特征,做为识别规则,例如返回地址检测、ROP Chain检测等;
3)基于攻击特征检测:通过检测漏洞利用相关的相对独立的组件来发现攻击,例如shellcode代码检测、畸形参数攻击检测等等。

从前文可知,victim被攻击的触发条件正是输入一段超长的参数,导致溢出而被利用攻击;
检测方法就是对victim的输入参数进行检查,如果超过一定值(例如256),就要产生告警发现攻击行为。
下图的红线之间的就是输入参数。

冲击波蠕虫就是利用这个漏洞进行传播攻击的,Windows Dcom RPC的主机名字段一般不是很长,服务端用栈缓存区存储这个值,但是拷贝时没有做长度检查,导致一个超长的串触发溢出执行任意指令。

检测方法:解码RPC协议,获取主机名,检查其长度,如果超过一定值,就要告警发现攻击行为。

下图的红线之间的就是主机名(够长吧。。)

从victim输入参数进行分析,可以看到返回地址非常明显,可以作为检测规则。
发现输入参数有返回地址,就要告警有攻击行为。

下图的红线所标识的就是返回地址特征。

可以分析出带有返回地址的匹配特征。

可以通过识别输入参数的shellcode特征进行匹配,如果参数包含shellcode肯定是异常行为。
同样,对于我们的溢出漏洞利用样本,进行静态分析,如果检测到有shellcode,就可以说明这个样本文件存在异常。

  • 有兴趣的小伙伴们,可以亲自动手操作一把漏洞利用过程,一定会有不一样的收获~
  • 研发同学们在后续的开发过程中,除了实现功能和性能,还要留意自己代码的安全性,做好输入检查,防止被黑客利用。

Phpcms网站内容管理系统是中国主流CMS系统之一,同时也是一个开源的PHP开发框架。由于Phpcms稳定、灵活、开源的特性,时至今日,Phpcms 2008版本仍被许多网站所使用。Phpcms 2008存在代码注入漏洞,漏洞编号为CVE-。攻击者可向网站上路径可控的缓存文件写入任意内容,从而可能获取webshell并执行任意指令。

阿里云安全近日已捕获到Phpcms 2008代码注入漏洞的多个利用样本。

规则防护:云防火墙虚拟补丁已支持防护

更多“哪些函数是PHP代码注入漏洞的敏感…”相关的问题

下列不是文件包含漏洞的敏感函数()

什么是敏感性分析?进行敏感性分析的意义有哪些?...

什么是敏感性分析?进行敏感性分析的意义有哪些?

以下哪些是对牙本质敏感的描述()

A.精神及环境因素常会诱发
D.非常容易形成口腔溃疡
此题为多项选择题。请帮忙给出正确答案和分析,谢谢!

通过对HTTP(S)请求进行检测,识别并阻断SQL注入、跨站脚本攻击、网页未马上上传、命令/代码注入、文件包含、敏感文件访问、第三方应用漏洞攻击、CC攻击、恶意爬虫扫描、跨站请求伪造等攻击,保护Web服务器安全稳定。请问这是华为哪个安全服务()

以下关于利率敏感性缺口的说法哪些是正确的()。

A. 可以用来衡量由资产负债期限错配而造成的利率风险

B. 指在一定时期内利率敏感性资产和利率敏感性负债之间的差额

C. 若利率敏感性资产大于利率敏感性负债,则存在正缺口,或称为资产敏感性

D. 若利率敏感性资产小于利率敏感性负债,则存在负缺口,或称为负债敏感性

E. 若利率敏感性资产等于利率敏感性负债,则为零缺口

此题为多项选择题。请帮忙给出正确答案和分析,谢谢!

下列哪些国家不是反洗钱重点监测的敏感国家()

请帮忙给出正确答案和分析,谢谢!

弱视眼的对比敏感度函数曲线()

此题为多项选择题。请帮忙给出正确答案和分析,谢谢!

此题为多项选择题。请帮忙给出正确答案和分析,谢谢!

我要回帖

更多关于 sql注入漏洞和防范 的文章

 

随机推荐