# nrsqli_public **Repository Path**: ziliudi/nrsqli_public ## Basic Information - **Project Name**: nrsqli_public - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-03-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 基本介绍 **nrsqli**是**nrscan**扫描器的SQL注入检测模块。 其基于[jsql-injection](https://github.com/ron190/jsql-injection)进行的二次开发。 ## 检测规则改动点 - #### 解决注入前缀找不到时,漏报的问题。 > 描述:原程序的检测思路是通过报错来获取注入的前缀,如' 或者 " 或者 空 > 痛点:如果页面不显示错误信息,则默认使用空进行注入,导致字符型sql注入漏报。 > 解决方法: 强制遍历 空、'、"、%2527、%df'、%df",若检测出注入则跳出遍历循环 - #### 解决了header注入时候,最后的+号被忽略的情况 > 描述:原程序注释符使用的是 --+ > 痛点:当注入点在http header中的时候,最后的注释会变为 -- ,而最后的空格在服务端取header值的时候会被去掉。 > 解决方法: 修改注释符为 --%201 - #### 解决了header注入时候,由于url编码被解码的情况下报错注入无法检测的问题 > 描述:原程序判断注入的`payload为1337\${INDICE}7330%2b1` > 痛点: 在请求的时候,http头中会将`%2b`解码为+号,当后端存在`$id = urldecode(addslashes(\$id));` 时候,加号会被当做空格处理,导致语法错误,从而漏报 > 解决方法: 修改为1337${INDICE}7332-1 - #### 解决了注入漏报的问题 > 描述: 原程序检测注入时候,会替换请求的默认值。 > 痛点: 在以下情况会漏报: 以下请求为例,如果id=1的记录不存在则不会sleep,所以要用用户原始的值来做判断 `http://vul.com/test.php?cc=4&id=1'+and+if(1=2,1,SLEEP(5))--+` > 解决方法: 使用原始值 ## 使用环境 jdk >= 1.8 ## 使用方法 在 `com.jsql.MainApplication.main` 中,以post请求为例, ``` model.controlInput("http://w8scan.com/test.php?cc=dd", "id=1*&a=c", "header:data", MethodInjection.REQUEST, "POST" ); ``` 在需要注入的参数中插入*号即可,注意在query参数、request参数和header中只能有一个*号。 如果找到注入,会抛出异常信息: ``` 可能存在 Error injection currentPayload: query: http://w8scan.com/test.php?cc=dd header: header:data request: id=1'or(select!(select*from((select+concat(0x53714c69,mid((repeat(0x23,65536)),1,64))))x)-~0)or'--%201&a=c ``` 此异常信息可以在 `com.jsql.util.ExceptionUtil.ExceptionHandler.uncaughtException` 中捕获