SQL注入(SQL Injection )
SQL注入攻击的产生 当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。 如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入。
SQL注入漏洞的本质是把用户输入的数据当做代码来执行,违背了
数据与代码分离
的原则。SQL注入漏洞有两个关键条件,理解这两个条件可以帮助我们理解并防御SQL注入漏洞:
用户能控制输入的内容
Web应用执行的代码中,拼接了用户输入的内容
本次实验中,我们先手工发现注入点,再使用sqlmap工具来注入。
本步利用手工发现sql显注
什么是sql显注:在sql注入的漏洞分类中,如果程序员没有对数据库的报错进行过滤,那么数据库所以产生的错误信息将呈现给前台的用户。当我们进行测试时,通过报错信息来证明用户的输入传递至数据库,此种漏洞的类型即为sql显注。
首先我们输入在浏览器中打开目标机网址172.16.12.2
进入漏洞验证平台,登录用户名为admin,密码 password,是个典型的弱密码。
在右侧下方的DVWA Secruty设置中,将DVWA漏洞演示环境的安全级别设置为Low级别。
来到SQL Injection 显注的页面。
看到他的user ID 是可以随意输入的
输入1的情况下返回的页面情况(网站正常的访问策略)
如果尝试输入1‘的情况下返回错误页面
我们发现页面中报错是直接返回数据库的报错信息,至此可以断定此页面存在sql注入,并且为显注模式。
本步骤将使用sqlmap对目标注入点进行扫描
sqlmap简介: sqlmap是一个开源的渗透测试工具,可以自动检测和利用SQL注入漏洞。并且它拥有一个强大的检测引擎,在安全人士眼中,这是一款必备的安全工具。
sqlmap常用选项:
准备工作1:我们需要启动burpsuite工具
准备工作2:我们需要将浏览器的代码配置为 127.0.0.1 端口 8080
如果配置成功,我们DVWA页面,我们将看到burpsuite的proxy选项卡中,成功的抓取到HTTP请求。 并且我们能看到一行对本次试验非常重要地方:PHPSESSID=xxxxx,security=low
至此准备工作已经全部完成,开启我们的攻击之旅啦
在burpsuite的intercept中右键,将截获的信息保存到文件中。
开启终端,使用sqlmap攻击,使用-r参数:
我们所使用的sql语句为: sqlmap -r /root/2
至此我们成功使用sqlmap对URL进行了注入测试,我们可以清晰的看到sqlmap成功的对URL进行了测试。
在输出中,成功的检测到目标主机的数据库版本、操作系统版本,PHP版本以及Apache的版本。
-
- <?php
- if(isset($_GET['Submit'])){
- // Retrieve data
- $id = $_GET['id'];
- $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
- $result = mysql_query($getid) 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");
- $html .= '<pre>';
- $html .= 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
- $html .= '</pre>';
- $i++;
- }
- }
- ?>
当代码获取用户所传入的参数后,直接带入sql进行查询
在正常情况下,传输至数据库的语句为:select first_name,last_name from users where user_id='1';
而当攻击者输入1‘后,传输至数据库的语句则变成:select first_name,last_name from users where user_id='1'';
当出现了2个‘后,则前面的一个闭合了代码中的’,但多出的一个‘则会导致sql产生错误,并且直接传回至web页面。
这也是为何我们使用1’测试显注的方式。