第一次成功复现一个简单漏洞,于是写下这篇随笔记录一下
首先我们来看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"> <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里的内容
总结
复现漏洞的过程中,能逐渐理解、明白漏洞的原理,清楚代码的构造,收获很大。