首页
社区
课程
招聘
[原创]读取popen输出结果时未截断字符串导致的命令行注入
发表于: 2018-2-18 23:55 6309

[原创]读取popen输出结果时未截断字符串导致的命令行注入

2018-2-18 23:55
6309

这种命令行注入在pwn中出现的比较少,所以记录分享一下。

熟悉web安全的话就知道,如果对特殊字符过滤不当,会引发sql注入或者xss等安全漏洞。其中,命令行注入较为严重,因为可以直接拿到漏洞程序当前权限的OSshell。
然而,命令行注入不仅在web中会出现,在C语言程序中,也会出现命令行注入的漏洞。比方说这道pwn题,就是调用system时,没有对输入数据进行\0截断以及对特殊字符处理不当而导致的。
命令行注入相对于其他二进制漏洞相比利用比较简单,比方说这道题,举个例子:

其中设计初衷,v6应当是一个合法的文件名。但是如果攻击者恶意操控v6,比方说,让v6为:'&&/bin/sh'
进行sprintf拼接后,system所执行的命令为:

这里有两个linux命令行的知识:

所以,执行上面的命令,相当于先执行了

再执行

所以,可以getshell。

题目所给的是一个library的服务,可以上传book,查看books,清除books。其中,book存放在lib/文件夹中。

其中list_books代码如上,v6来自fread从popen中的返回结果。他本来想做的是输出每个文件的大小,但是fread后没有用\0截断。所以调用strtok时,可能会读到fread后面的垃圾数据(当然如果可以操控的话就不是垃圾数据了)

sprintf的栈溢出会比较难利用,因为&s比较大,有0x800,而v6是从&ptr里面strtok出来的,而&ptr更小,只有0x400。所以应该没法很好的利用。

那么,我们怎么去操控&ptr中的垃圾数据呢?这个时候看看另外一个函数

其中,这在栈中也会分配0x400个字节,并且我们可以写入。
并且,调用完这个函数之后,清除栈空间时,只是简单地add esp,xxx,并不会清空其中数据。然后,再调用存在命令行注入的函数并分配栈空间时,也只是单纯地sub esp,xxx,也不会清空数据。在C语言中,如果此时对不赋值的局部变量直接访问的话,是UB行为。但是,从二进制安全的角度看的话,便是可利用的点了。其中这道题,本身就是一个局部字符串读取后未截断而造成的UB,然而我们便可以利用这个。

那么来试试:
图片描述

很明显,BBBB123456789123456789123456789123456789AAAA的后面89123456789AAAA被拼接到du -sh lib/'%s'中了
动态调试看一下的话

第一次在system停下
图片描述

第二次在system停下
图片描述

所以很明显,只要把89123456789AAAA改成

就可以getshell了。如前面所说。
其中,\x00是我们自己手动截断,不然strtok还会继续往后读。

所以最后exp


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-2-20 04:20 被holing编辑 ,原因: 补充
上传的附件:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//