此篇文章作为本人的学习小笔记,有任何不足之处望各位大牛多多指教~
SQL注入漏洞作为OWASP TOP10中重要的一部分,可见其安全性的危害有多大。简单地说,SQL注入就是通过构建特殊的具有SQL语法的语句,绕到数据库中进而执行相应的操作的漏洞。关于SQL注入更多的描述就不再多说了,网上资料也很多,下面就直接上笔记。
基于报错的检测方法:
各种符号以及组合: ‘ “ ( %
基于布尔的检测:
1’ and ‘1’=’1和1’ and ‘1’=’2相当于1’ and ‘1和1’ and ‘0
当返回的结果不同时即有漏洞
几个常用的函数:
user()返回当前数据库连接使用的用户;
database()返回当前数据库连接使用的数据库;
version()返回当前数据库的版本;
concat或者concat-ws函数可以将这些函数进行组合使用并显示出来。concat函数中,将其中的参数直接连接起来产生新的字符串。而在concat_ws函数中,第一个参数是用于作为分隔符将后面各个参数的内容分隔开来再进行相应的连接产生新的字符串。以其常用的例子为例:
concat_ws(char(32,58,32),user(),database(),version())
其中char()函数为将里面的参数转化为相应的字符,其中32为空格,58为冒号(:),通过这样的方式可以绕过一些简单的过滤机制。
@@datadir @@hostname @@VERSION @@version_compile_os
Low级:
源代码:<?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");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
可以看到,对于输入的变量id的值并没有过滤而直接用到SELECT语句中,报错还调用mydql_error()函数显示mysql数据库的报错信息。
下面就直接进行检测利用了:
先输入一个单引号,发现会报错,接着输入基于布尔检测的两条语句,发现第一条会直接返回信息,第二条没有反应,可以确定存在SQL注入漏洞:
接着通过order by语句猜测列数,一开始输入3时报错,改为2时正常输出,即可确定有两列:
再就是用union语句接上select语句使用前面提过的函数组合即可查询到用户、数据库及其版本等信息:
获取目标主机操作系统的信息:
知道数据库为dvwa后,查询所有的表名,可知道有两个:
可知users表更为重要,直接对其进行进一步的查询,查看其所有的列名: