SQL爆库,表,字段以及双写绕过
一、SQL爆库,表,字段基础
1.select
在SQL语句中select username from table where id=1,这条语句执行的在table表中查询并返回id为1的username数据,那select我们可以理解为查询返回的数据,那select 1这条语句我们则可以简单理解为查询并返回1,在简单的无过滤SQL注入题目中如果只有一个回显result:?,输入提交select 1的话,就会输出result:1
2.unino
unino操作符用于合并两个或多个select语句的结果集,比如unino select 1,2这段语句就会将1,2两个数据作为结果集,分别返回1,2,如果回显为
result1:?;result2:?
输入提交unino select 1,2的话,就会回显result1:1;result2:2
3.group_concat()
group_concat() 函数将 group by子句产生的同一个分组中的值连接起来,返回一个字符串结果。
简单的说,就是该函数传入的变量含有多个值,该函数能将这多个值用逗号隔开,并返回一个字符串
二、SQL爆库,表,字段原理
SQL数据库中有默认库information_schema中,其中包含两个重要表
1.information_schema.schemata
schemata表中包含了数据库存在的所有的库名,库名的字段为 schema_name
那如果只有一个回显时,我们就可以输入
1
union select group_concat(schema_name) from information_schema.schemata
查询并返回schemata表中schema_name的所有值。
如果有多个回显,我们就可以用数字进行占位nion select 1,2,……,group_concat(schema_name) from information_schema.schemata最后一个回显就会是所有库名了
2.information_schema.tables
tables表中包含了数据库存在的所有的表名,库名的字段为 table_name,此时爆表要加where
1
union select group_concat(table_name) from information_schema.tables where table_schema=?
其中?内填写爆的库名
3.information_schema.columns
columns表中包含了数据库存在的所有的字段名,库名的字段为 column_name,其他和爆表同理
知道了以上三种我们就能获得所有库名,表名,和字段名
拥有字段名我们就能进行获得想要的各种值了
1 | |
以上就是爆库,表,列名的基本操作
三、双写绕过
但是在实际注入过程中后端不会轻易的放过你的数据,会用各种规则进行过滤,这时候我们就需要绕过这些过滤规则,这里我先介绍一种比较简单的绕过方式——双写绕过
原理
后端有时候会对一些敏感数据进行一些处理,常见的就像将敏感数据修改为空,比如当判断存在unino时,就将它变为空,解决的方法也很简单,改成ununinoino即可,当unino为空时,前后两段字符刚好组合成union,成功绕过
四、实战
我们选择buuctf中的一道SQL注入题目为例子
buuctf:https://buuoj.cn/
当我们输入1’ union select 1#时,会显示第一行1#附近有语法错误,这时候就是对1#前面的数据进行了过滤,这时候我们双写一下试试1’ ununionion selselectect 1#
发现双写绕过可行,但是列数不对尝试增加列数,输入
1 | |

列数正确为3,且回显示为2和3
尝试爆库
1 | |

发现还是有过滤显示.schemata#前有information_schema,from过滤,继续尝试双写绕过
1 | |

发现双写过头了过滤的是or,修改数据
1 | |

可以拿到库名,发现ctf很特别,我们爆一下表
1 | |

发现where过滤,继续双写
1 | |

获得表名Flag,继续爆字段
拿到字段flag,获取内容
1 | |
成功拿到flag