本文作者:一合(Kali Linux2020星球学员)
对于代码审计初学者而言,bluecms拿来练手是不二之选.对于bluecms的审计方法,我先是用了通读全文,又用回溯危险函数进行审计.对于这个远古cms的漏洞,随便看看就能找到一堆,多数是一些注入未过滤或未有单引号保护之类的.但是在昨天晚上,我发现一个很有意思的漏洞,拿出来自己记录一下,顺便给星球的初学者朋友们分享一下思路,说的不对的地方还请大佬们轻喷.
漏洞是再/include/common.fun.php文件中,这个文件是定义的公共函数文件,代码在579行,
$sql = "INSERT INTO".table('post_att')." (post_id, att_id, value) VALUES ('$post_id','$k', '$v')";
这条sql语句中存在变量(见下图).
可以看到$post_id是函数形参传过来的,$k,$v是形参$att_val的键和值,这个参数应该是一个数组.我们在程序中搜索insert_att_value函数,用来追溯该函数实例化传参的地方(见下图).
发现根目录下user.php 文件实例化了该函数并传递了参数,于是跟进去.
这个函数传入两个实参,$must_att_arr, $post_id 其中$post_id经过了intval过滤,且单引号导入sql语句,无法利用.而$must_att_arr的值来自于另一个函数,如下:
$must_att_arr = get_att($model_id, $_POST['att1'], 'must_att');
追踪到get_att函数中,发现该函数就是处理数组的函数,
这时候我决定用xdebug传入参数调试一下,看看数组的处理,注意,该函数主要处理的是post进来的’att1’数组,我们构造get和post请求,是user.php满足if条件,如下图.
我们传入的att1接受的数组key值是key,value值是abc’,然后我发现post进来的abc’被过滤成abc’了.
过滤函数我也找到了,文件一开始就包含进来了!
可见,post/get/cookie都做了防注入,但没有过滤xss,当然我们重点是找注入点,但是我发现传入的数组key值没有过滤,现在很多框架都不过滤key值,试着用key’进行注入测试.
发现成功报错.用sqlmap跑一下,搞定.(sqlmap截图用的之前缓存,懒得从新跑了)
总结,这次虽然过滤了value值,但是没有过滤数组的key值,利用insert语句进行注入.现在很多框架都没有过滤key值,这次审计算积累了一点小经验吧.
扫描下方二维码加入Kali linux2020星球学习
加入后会邀请你进入内部微信群,内部微信群永久有效!
本文始发于微信公众号(Ms08067安全实验室):一次有意思的代码审计(初学)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论