_昏鸦

导航

 

第一次成功复现一个简单漏洞,于是写下这篇随笔记录一下

首先我们来看dvwa中low级的sql注入的源码

 

 

源码文件路径如下图:

 

 

源码如下:

 1 <?php    
 2 
 3 if(isset($_GET['Submit'])){
 4     
 5     // Retrieve data
 6     
 7     $id = $_GET['id'];
 8 
 9     $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
10     $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
11 
12     $num = mysql_numrows($result);
13 
14     $i = 0;
15 
16     while ($i < $num) {
17 
18         $first = mysql_result($result,$i,"first_name");
19         $last = mysql_result($result,$i,"last_name");
20         
21         $html .= '<pre>';
22         $html .= 'ID: ' . $id . '<br>名字: ' . $first . '<br>姓氏: ' . $last;
23         $html .= '</pre>';
24 
25         $i++;
26     }
27 }
28 ?>

  简单分析一下源码,

      当php确认用户提交表单后开始执行,接受id参数给$id,未经任何过滤直接用sql语句查询数据库,最后将查询后的结果集中的数据打印出来

接下来为了复现漏洞,用phpMyAdmin创建一个新数据库

  创建了一个test的数据库,库里创建了users表,表中随便写了一些数据如下:

    

然后写一个可以查询数据库内容的网页,开始复现漏洞

  代码如下:

   

 1 <!DOCTYPE HTML>
 2 <html>
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
 5 </head>
 6 <body>
 7 <form action="" method="GET">
 8 <p>id:<br/><input type="text" name="id">&nbsp<input type="submit"  name='submit' value="submit"/>
 9 </p>
10 </form>
11 <?php
12 
13 error_reporting(E_ALL&~E_NOTICE);
14 
15 //      连接数据库和test表
16 $con=mysql_connect("localhost","root","root");
17 if (!$con){
18     die('Could not connect: ' . mysql_error());
19 }
20 $db_selected = mysql_select_db("test", $con);
21 
22 
23 if(isset($_GET['submit'])){  //判断表单是否提交
24     $id=$_GET['id'];     //接受表单中id的参数赋给$id
25     $sql="SELECT user_name FROM users WHERE user_id='$id'";  //sql查询语句
26 
27         //执行查询语句并将结果集赋给$result
28     $result=mysql_query($sql) or die('<pre>' . mysql_error() . '</pre>' );
29 
30 
31     $num = mysql_numrows($result);
32     $i = 0;
33     while ($i < $num) {
34 
35                //提取$result的结果集中的user_name的数据并将其赋给$name
36         $name = mysql_result($result,$i,"user_name");
37 
38           // 将$id和$name的值拼接在变量$html上最后打印出来
39         $html .= '<pre>';
40         $html .= 'ID: ' . $id . '<br>名字: ' . $name;
41         $html .= '</pre>';
42         $i++;
43     }
44     echo $html;
45 }
46   
47 ?>
48 </body>
49 </html>

测试

    

  先试试正常的输入,显示出与用户ID相应的用户名

 

                     

    接着试试 万能密码 ,显示出了所有用户名

    接着就是查看数据库及其管理员账号

              

  

   接着是一系列sql注入

       

      爆数据库名

      

      爆列名(这里好像把dvwa数据库的users表里的内容也爆出来了……)

     

     爆user_pwd里的内容

总结

    复现漏洞的过程中,能逐渐理解、明白漏洞的原理,清楚代码的构造,收获很大。

posted on 2017-07-19 14:25  _昏鸦  阅读(2539)  评论(6编辑  收藏  举报