sqlmap sql注入问题

安装burp suite

渗透必备神器Burpsuit的安装和简单使用教程

配置浏览器代理 127.0.0.1:80

https://baijiahao.baidu.com/s?id=1608443655431062847&wfr=spider&for=pc

 1. 从Proxy开始介绍并进行最简单的实操
 2. 整个burp suite的使用最多点击Options
 3. 默认是127.0.0.1:8080如果你的没有自己设置的话,那就添加就好了,我们打开浏览器,这里我推荐firefox,我们在设置里面点开高级,单击网络
 4. 我们默认是不使用代理的但是我们做一个修改就可以了,点击手动配置代理之后修改http代理为127.0.0.1端口为8080

Proxy版块

Forward:将请求包发送
Drop:丢掉请求包
Intercept is on/off:截断的开关
Action对请求包的一些操作

Repeater板块

相当于postman的功能

sqlmap工具

https://www.cnblogs.com/php09/p/10404560.html
sqlmap -u “http://www.vuln.cn/post.php?id=1”
默认使用level1检测全部数据库类型
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3
指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)
http://www.vuln.cn/1992

参数:-r

sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等)。
比如文本文件内如下:
POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0
id=1
当请求是HTTPS的时候你需要配合这个–force-ssl参数来使用

参数:–dbms

默认情况系sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2

参数:–dbs

当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。
列举数据库表

sqlmap 实操

把1.txt 放到 sqlmapproject-sqlmap-1.4.4-6-gf63a92a 目录下

使用 sqlmap.py -r 1.txt --dbms mysql --dbs
会提示json data found in post body do you want process it Y?N
之后会进行自动扫描
出现
there is not at least one other technique found  Do you want reduce the number of request Y?N  y
如结果出现
Paramter : JSON orderBy  ----------------------------
如无上去了注入
则有CRITICAL   all test paramters do not appear to be injectable

注意

1.请求体重存在可注入的参数,请求结果不能为空,要能调通
2.  任何抓包工具都可以作为1.txt中的请求体
3. 有token的话。要保证token有效性

SqlInjectionFilter

以下无法满足字段中本身需要带操作类型的参数

Java防止SQL注入(通过filter过滤器功能进行拦截)
https://www.cnblogs.com/pypua/articles/9561629.html

解决mybatis-plus动态排序,导致的SQL注入问题

https://springboot.io/t/topic/905

使用过滤器过滤MP的排序sql注入结合
https://my.oschina.net/xiaohui249/blog/1616865?utm_medium=referral

java8forEach的方式,遍历JSON中所有的KEY
https://blog.csdn.net/scholar_man/article/details/106203979

过滤相关字符

 else if (key.equals("orderBy")) {
                String value = jsonObject.getString(key);
                logger.info("orderBy   value========>{}", value);

                if (!StringUtils.isEmpty(value)) {
                    if ((value.length() > 20) || (!value.matches("[A-Za-z0-9_.]+"))) {
                        logger.error("非法的排序字段名称:" + jsonObject.get(key).toString());
                        return Boolean.FALSE;
                    }
                }
            } else if (key.equals("order")) {
                String value = jsonObject.get(key).toString();
                logger.info("order   value========>{}", value);

                if (!StringUtils.isEmpty(value)) {
                    String str2 = value.toLowerCase();
                    if (!(str2.equals("asc") || str2.equals("desc"))) {
                        logger.error("非法的排序关键字:" + jsonObject.get(key).toString());
                        return Boolean.FALSE;

                    }
                }

            }

Required request body is missing 错误解决

遇到这个问题的读者应该使用了如下一种或几种技术:

  1. 使用POST提交Http请求;
  2. 使用了Filter或者拦截器(Interceptor)对HttpServletRequest对象提交的数据进行了读取操作;
  3. 在Controller的方法中使用了注解@RequestBody解析请求参数;

问题产生分析

先打个比方,一支100ML试验管装满100ML实验液体,一次实验从该试验管抽取100ML液体使用,之后再做一次实验,从该试验管获取实验液体,请问还能得到吗?当然不能,对!
同样的道理,如果在请求对象未到达方法之前,对HttpServletRequest对象自带的信息流(通过getInputStream方法获得)进行了读取,读取完成之后该InputStream的可读内容变为了0,那么该请求对象到达对应的处理方法之后,@RequestBody注解无法从请求对象中解析到请求参数信息,报错:“Required request body is missing”。
基础比较扎实的同学可能会问,InputStream类有mark方法和reset方法,servlet为什么不重写这些方法使得HttpServletRequest可重复读呢?请大家发散思维。

问题解决方案

https://my.oschina.net/xiaohui249/blog/1616865?utm_medium=referral

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值