GVKun编程网logo

RegEx检测SQL注入(检测sql注入工具)

9

此处将为大家介绍关于RegEx检测SQL注入的详细内容,并且为您解答有关检测sql注入工具的相关问题,此外,我们还将为您介绍关于(ZZ)SQL注入分析(手动注入检测)and手动注入脚本命令精华版、as

此处将为大家介绍关于RegEx检测SQL注入的详细内容,并且为您解答有关检测sql注入工具的相关问题,此外,我们还将为您介绍关于(ZZ)SQL注入分析(手动注入检测) and 手动注入脚本命令精华版、asp.net下检测SQL注入式攻击代码、c# – 如何使用Regex检查参数?、Mybatis-plus sql注入及防止sql注入详解的有用信息。

本文目录一览:

RegEx检测SQL注入(检测sql注入工具)

RegEx检测SQL注入(检测sql注入工具)

是否有正则表达式可以检测字符串中的sql?有没有人有他们之前分享过的东西样本?

解决方法

不要这样做.你几乎可以保证失败.请改用PreparedStatement(或其等价物).

(ZZ)SQL注入分析(手动注入检测) and 手动注入脚本命令精华版

(ZZ)SQL注入分析(手动注入检测) and 手动注入脚本命令精华版

入侵过程主要包括以下几个步骤:1、测试ASP系统是否有注入漏洞;2、获取数据库表名;3、测试管理 员ID;4、测试管理员用户名长度和管理员密码长度;5、从高到低依次测试出管理员用户名和密码。 测试ASP系统是否有注入漏洞 这很关键,没有漏洞的网站你就别瞎忙了。方法也很简单,打开ASP网 站一个分类网页,如盗帅下载系统中的/list.asp?id=11和逸风系统中的/class.asp?id=18等,在其后面 分别加入and 1=1 和and 1=2进行测试,具体形式为 /list.asp?id=11 and 1=1 (以下各测试语句都用同样的形式加入,TTY将不再说明) 注意空格。在IE浏览器里空格将自动转换为%20。如果输入and 1=1 能正常显示原页面内容,输入 and 1=2不能正常显示原页面内容,就说明有SQL注入漏洞了,可以进行下面的步骤。 测试数据库表名 一个数据库里一般有很多表,我们要找到存放管理员用户名和密码的表。对于已知 类型的ASP系统来说,可以到网上去下载一个压缩包,用辅臣数据库浏览器打开数据库查看就可以了,一 般都是admin。无论是否知道表名,都加以下语句测试一下: and 0<>(select count(*) from admin) 如果能返回正常页面,说明表名就是admin,否则继续换表名测试。; 测试管理员ID 一般网站的管理员不是很多的,ID也不是很大,依次用1、2、3 … … 测试,很快 就能测到,具体测试语句为: and (select count(*) from admin where id=1) 变换最后的数字1进行测试,直到能正常返回原页面为止。 测试管理员用户名长度和管理员密码长度 这很重要,不知道用户名和密码是几位数下面的工作就无法 进行。 用户名长度: and (select count(*) from admin where id=5 and len(username)=4) [...]

asp.net下检测SQL注入式攻击代码

asp.net下检测SQL注入式攻击代码

两个类:
(页面数据校验类)pagevalidate.cs基本通用。
代码如下:


使用系统; 
使用System.Text; 
使用的System.Web; 
使用System.Web.UI.WebControls; 
使用System.Text.RegularExpressions; 
命名空间常用

/// 
///页面数据校验类
/// 
public类PageValidate 

私有静态正则表达式RegNumber =新的正则表达式(“^ [0-9] + $”); 
私有静态正则表达式RegNumberSign =新的正则表达式(“^ [+ - ] [0-9] + $?”); 
私有静态正则表达式RegDecimal =新的正则表达式(“[]?^ [0-9] + [0-9] + $”); 
私有静态正则表达式RegDecimalSign =新的正则表达式(“^ [+ - ] [0-9] + [0-9] + $?[]?”); //等价于^ [+ - ] \ D + \ D + $?[] 
私有静态正则表达式RegEmail =新的正则表达式(“^ [\\ W - ] + @ \\ W - ] + \\(COM |网络|组织| EDU |密|电视| BIZ |资讯)$“); //W¯¯英文字母或数字的字符串,和[A-ZA-Z0-9]语法一样
私有静态正则表达式RegCHZN =新的正则表达式( “[\ u4e00- \ u9fa5]”); 
公共PageValidate()



#地区数字字符串检查
/// 
///检查申请查询字符串的键值,是否是数字,最大长度限制
/// 
///请求
///请求的键值
// /最大长度
///返回请求查询字符串
的公共静态字符串FetchInputDigit(REQ的HttpRequest,串inputKey,MAXLEN诠释)

字符串= retVal的的String.Empty; 
如果(inputKey = NULL && inputKey =的String.Empty!)

retVal的= req.QueryString [inputKey] 
如果(空== retVal的)
retVal的= req.Form [inputKey] 
如果(空= retVal的!)

retVal的= SQLTEXT(retVal的,MAXLEN); 
如果(ISNUMBER(retVal的)!)
retVal的=的String.Empty; 


如果(retVal的== NULL)
retVal的=的String.Empty; 
返回retVal的; 

/// 
///是否数字字符串
/// 
///输入字符串
/// 
公共静态布尔ISNUMBER(字符串inputData)

匹配M = RegNumber.Match(inputData); 
返回m.Success; 

/// 
///是否数字字符串可带正负号
/// 
///输入字符串
/// 
公共静态布尔IsNumberSign(字符串inputData)

匹配M = RegNumberSign.Match(inputData); 
返回m.Success; 

/// 
///是否是浮点数
/// 
///输入字符串
/// 
公共静态布尔IsDecimal(字符串inputData)

匹配M = RegDecimal.Match(inputData); 
返回m.Success; 

/// 
///是否是浮点数可带正负号
/// 
///输入字符串
/// 
公共静态布尔IsDecimalSign(字符串inputData)

匹配M = RegDecimalSign.Match(inputData); 
返回m.Success; 

#endregion 
#区域中文检测
/// 
///检测是否有中文字符
/// 
/// 
/// 
公共静态布尔IsHasCHZN(字符串inputData)

匹配M = RegCHZN.Match(inputData); 
返回m.Success; 

#endregion 
#地区邮件地址
/// 
///是否是浮点数可带正负号
/// 
///输入字符串
/// 
公共静态布尔ISEMAIL(字符串inputData)

匹配M = RegEmail.Match(输入数据); 
返回m.Success; 

#endregion 
#地区其他
/// 
///检查字符串最大长度,返回指定长度的串
/// 
///输入字符串
///最大长度
/// 
公共静态字符串SQLTEXT(字符串的SQLInput,INT最大长度)

如果(的SQLInput = NULL &&的SQLInput =的String.Empty)!

的SQLInput = sqlInput.Trim(); 
如果(sqlInput.Length>最大长度)//按最大长度截取字符串
的SQLInput = sqlInput.Substring(0,最大长度); 

返回的SQLInput; 

/// 
///字符串编码
/// 
/// 
/// 
公共静态字符串的HTMLEncode(字符串inputData)

返回HttpUtility.HtmlEncode(inputData); 

/// 
///设置标签显示编码的字符串
/// 
/// 
/// 
公共静态无效SetLabel(标签LBL,串txtInput)

lbl.Text =的HTMLEncode(txtInput); 

公共静态无效SetLabel(LBL标签,对象inputObj)

SetLabel(LBL,inputObj.ToString()); 

//字符串清理
公共静态字符串的inputText(字符串inputString,INT最大长度)

StringBuilder的retVal的=新的StringBuilder(); 
//检查是否为空
,如果((inputString = NULL)&&(inputString =的String.Empty)!)

inputString = inputString.Trim(); 
//检查长度
如果(inputString.Length>最大长度)
inputString = inputString.Substring(0,最大长度); 
//替换危险字符
的for(int i = 0;我
开关(inputString [I])

案''“:
retVal.Append(”“”); 
打破; 
案''retVal.Append(“打破; 
案例''>'':
retVal.Append(“>”); 
打破; 
默认:
retVal.Append(inputString [I]); 
打破; 


retVal.Replace(“''”,“”); //替换单引号

返回retVal.ToString(); 

/// 
///转换成HTML代码
/// 
///串
///字符串
公共静态字符串编码(字符串str)

海峡= str.Replace(“&”,“&”); 
海峡= str.Replace(“''”,“''”); 
海峡= str.Replace(“\”“,”“”); 
海峡= str.Replace(“”,“”); 
海峡= str.Replace(“海峡= str.Replace(“>”,“>”); 
海峡= str.Replace(“\ n”,“ 
”); 
返回海峡; 

/// 
///解析HTML成普通文本
/// 
///字符串
///字符串
公共静态字符串解码(字符串str)

海峡= str.Replace(“ 
”,“\ n”); 
海峡= str.Replace(“>”,“>”); 
海峡= str.Replace(“海峡= str.Replace(“”,“”); 
海峡= str.Replace(“”“,”\“”); 
返回海峡; 

#endregion 

}


通用文件(Global.asax中),保存为的Global.asax文件名放到网站根木马下即可。(其他功能自行补上)

c# – 如何使用Regex检查参数?

c# – 如何使用Regex检查参数?

我坚持使用正则表达式.该程序是一个用C#编写的控制台应用程序.有一些命令.我想首先检查参数是否正确.我认为使用正则表达式会很容易,但不能这样做:

var strArgs = "";

foreach (var x in args)
{
    strArgs += x + " ";
}
if (!Regex.IsMatch(strArgs,@"(-\?|-help|-c|-continuous|-l|-log|-ip|)* .{1,}"))
{
    Console.WriteLine("Command arrangement is wrong. Use \"-?\" or \"-help\" to see help.");
    return;
}

用法是:

program.exe [-options] [domains]

问题是,程序接受所有命令.另外我需要检查“ – ”前缀命令是否在域之前.我认为这个问题并不难解决.

谢谢…

解决方法

既然您最终还是会编写一个switch语句来处理选项,那么最好在那里进行检查:

switch(args[i])
{
case "-?": ...
case "-help": ...
...
default:
  if (args[i][0] == '-')
    throw new Exception("Unrecognised option: " + args[i]);
}

Mybatis-plus sql注入及防止sql注入详解

Mybatis-plus sql注入及防止sql注入详解

一、SQL注入是什么?

SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被 插入到执行的SQL语句中来改变查询结果,例如: OR 1=1 或者 ;drop table sys_user;等等

二、mybatis是如何做到防止sql注入的

mybatis中我们所写的sql语句都是在xml只能完成,我们在编写sql会用到 #{},${} 这个两个表达式。那 #{} 和 ${}两者之间有什么区别嘞?下面我将用两个SQL语句例子来进行说明。

<select id="selectUserByUserName" parameterType="java.lang.String" resultType="com.domain.UserInfo">
	SELECT USER_ID, USER_NAME, PWD, USER_PHONE FROM SYS_USER 
	<where>
		USER_ID= #{userName,jdbcType=VARCHAR} 
	</where> 
</select>
<select id="selectUserByUserName" parameterType="java.lang.String" resultType="com.domain.UserInfo">
	SELECT USER_ID, USER_NAME, PWD, USER_PHONE FROM SYS_USER 
	<where>
		USER_NAME= ${userName,jdbcType=VARCHAR} 
	</where> 
</select>
  • 第一种SQL语句中使用的#{}方式,#{}中当传入的数据是字符串,会在使用" "双引号将值引起来。
  • 示例:例如 userName 传入的值是 9;DROP TABLE SYS_USER;那么#{}去取后得到的结果就是 USER_NAME="9;DROP TABLE SYS_USER;"就算传入删除表的命令也不会被执行,因为9;DROP TABLE SYS_USER;会帮当成一个完成的字符串去进行值匹配。
  • 第二种SQL${}方式取值,那就变成了USER_NAME=9;DROP TABLE SYS_USER; , 因 为 ${}直接将值拼接在SQL语句后面的,使其成为SQL,因此直接将值拼接在SQL语句后面的,因此${}是存在SQL注入的风险的,在使用时要注意手动处理。

1. #{} 和 ${} 两者的区别

  • #{}:解析为一个 JDBC 预编译语句,一个 #{} 被解析为一个参数占位符 ? ,#{}方式将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。 如:WHERE USER_NAME =#{username},如果传入的值是9,那么解析成sql时的值为WHERE USER_NAME =“9”,如果传入的值是12345678,则解析成的sql为WHERE USER_NAME =“12345678”,
  • ${} 仅 仅 为 一 个 纯 粹 的 s t r i n g 替 换 ,${}方式传入的变量直接拼接在sql中。如:WHERE USER_NAME = ${username},如果传入的值是9,那么解析成sql时的值为WHERE USER_NAME =9; 如果传入的值是;DROP TABLE SYS_USER;,则解析成的sql为:SELECT USER_ID, USER_NAME, PWD, USER_PHONE FROM SYS_USER WHERE USER_NAME="9;DROP TABLE SYS_USER;所以象 ORDER BY 或者 GROUP BY 等可以使用 ${}方式。
  • #{}方式底层采用预编译方式PreparedStatement,能够很大程度防止sql注入,因为SQL注入发生在编译时;${}方式底层只是Statement,无法防止Sql注入。
    $方式一般用于传入数据库对象,例如传入表名

2.PreparedStatement和Statement的区别

① PreparedStatement 在执行sql命令时,命令会先被数据库进行解析和编译,然后将其放到命令缓存区,然后,当每一个执行的相同的sql 命令时,若在缓存区发了编译命令,就不会再次进行解析和编译,这样就可以进行重复使用。PreparedStatement 在编译是会将每个#{}标记符号解析为参数参数占位符?,传入的变量就是做为参数,不会对sql语句进行修改,这样就能防止SQL注入的攻击。‘’

②Statement是直接将Sql命令直接交给数据库进行运行,不能做到拦截SQL注入的攻击,因为SQL注入时发生在运行时。Statement每次都会对SQL命令进行解析和编译,增加大数据库的开销,因此它效率不如PreparedStatement。

3.什么是预编译

预编译是做些代码文本的替换工作。是整个编译过程的最先做的工作。处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。而SQL注入只能发生在运行时。

4.mybaits-plus sql注入产生的原因

Mybatisplus中的 PaginationInterceptor 主要用于处理数据库的物理分页,避免内存分页。
分析PaginationInterceptor 的源码可以发现

Orderby场景下的SQL注入

前面提到了分页中会存在Orderby的使用,因为Orderby动态查询没办法进行预编译,所以不经过安全检查的话会存在注入风险。PaginationInnerInterceptor主要是通过设置com.baomidou.mybatisplus.extension.plugins.pagination.page对象里的属性来实现orderby的,主要是以下函数的调用,因为直接使用sql拼接,所以需要对进行排序的列名进行安全检查:

page.setAscs();
page.setDescs();

源码:

可以看出,分页是通过字符串拼接的方式,所以出现SQL注入的风险

 public static String concatOrderBy(String originalSql, IPage<?> page, boolean orderBy) {
        if (!orderBy || !ArrayUtils.isNotEmpty(page.ascs()) && !ArrayUtils.isNotEmpty(page.descs())) {
            return originalSql;
        } else {
            StringBuilder buildSql = new StringBuilder(originalSql);
            String ascStr = concatOrderBuilder(page.ascs(), " ASC");
            String descStr = concatOrderBuilder(page.descs(), " DESC");
            if (StringUtils.isNotEmpty(ascStr) && StringUtils.isNotEmpty(descStr)) {
                ascStr = ascStr + ", ";
            }

            if (StringUtils.isNotEmpty(ascStr) || StringUtils.isNotEmpty(descStr)) {
                buildSql.append(" ORDER BY ").append(ascStr).append(descStr);
            }

            return buildSql.toString();
        }
    }

三、Mybatis-plus是如何做到防止sql注入的

在使用分页的controller,对传入的分页插件,对ascs与descs进行检查,判断是否有非法字符,如有,则提示参数中含有非法的列名:create_time aaaa

示例:

校验字段的util:

package com.koal.util;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.koal.exception.BizException;
import com.koal.web.ErrorCode;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.Optional;
import java.util.regex.Pattern;

/**
 * @author sunrj
 */
public class RegexUtils {

    /**
     * 对Page校验防止sql注入
     *
     * @param
     */
    public static void verifyPageFileld(Page page) {

        //asc校验
        Optional.ofNullable(page.ascs()).ifPresent(ascs ->  {
            Arrays.asList(ascs).forEach(asc -> {
                boolean rightfulString = RegexUtils.isRightfulString(asc);
                if (!rightfulString) {
                    throw new BizException(ErrorCode.COMMON_VERIFY_ERROR.getCode(), "ascs参数中含有非法的列名:" + asc);
                }
            });
        });
        //desc校验
        Optional.ofNullable(page.descs()).ifPresent(descs ->  {
            Arrays.asList(descs).forEach(desc -> {
                boolean rightfulString = RegexUtils.isRightfulString(desc);
                if (!rightfulString) {
                    throw new BizException("10011", "desc参数中含有非法的列名:" + desc);
                }
            });
        });
    }

    /**
     * 判断是否为合法字符(a-zA-Z0-9-_)
     *
     * @param text
     * @return
     */
    public static boolean isRightfulString(String text) {
        return match(text, "^[A-Za-z0-9_-]+$");
    }

    /**
     * 正则表达式匹配
     *
     * @param text 待匹配的文本
     * @param reg  正则表达式
     * @return
     */
    private static boolean match(String text, String reg) {
        if (StringUtils.isBlank(text) || StringUtils.isBlank(reg)) {
            return false;
        }
        return Pattern.compile(reg).matcher(text).matches();
    }
}

controller校验page中的字段:

@GetMapping
	@ApiOperation(value = "查询用户列表", notes = "查询用户列表")
	public ServerResponse<IPage<Account>> queryAccount(Page<Account> page) {
	    //校验page中的字段,防止sql注入
		RegexUtils.verifyPageFileld(page);
		return ServerResponse.successMethod(accountService.query(page));
	}

结果:

POST http://127.0.0.1:8080/account?current=1&size=10&ascs=create_time;DROP TABLE tb_account;


结果:
{
    "code": "10011",
    "msg": "ascs参数中含有非法的列名:create_time;DROP TABLE ag_account_info;",
    "timestamp": 1653547051505
}

补充:Mybatis Plus自定义全局SQL注入

实现步骤如下:

  • 在 Mapper接口中定义相关的 CRUD方法
  • 扩展 AutoSqlInjector inject 方法,实现 Mapper接口中方法要注入的 SQL
  • 在 MP全局策略中,配置 自定义注入器

① mapper中定义业务方法

如下所示:

public interface EmployeeMapper extends BaseMapper<Employee> {
    int  deleteAll();
}

② 实现自己的MySqlInjector

如下所示:

/**
 * 自定义全局操作
 */
public class MySqlInjector  extends AutoSqlInjector{
    /**
     * 扩展inject 方法,完成自定义全局操作
     */
    @Override
    public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass,
            Class<?> modelClass, TableInfo table) {
        //将EmployeeMapper中定义的deleteAll, 处理成对应的MappedStatement对象,加入到configuration对象中。
        
        //注入的SQL语句
        String sql = "delete from " +table.getTableName();
        //注入的方法名   一定要与EmployeeMapper接口中的方法名一致
        String method = "deleteAll" ;
        
        //构造SqlSource对象
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
        
        //构造一个删除的MappedStatement
        this.addDeleteMappedStatement(mapperClass, method, sqlSource);
    }
}

③ 把自定义的MySqlInjector 配置到全局策略中

如果是xml配置方式,实例如下:

<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默认值就是true -->
<property name="dbColumnUnderline" value="true"></property>

<!-- Mysql 全局的主键策略 -->
<property name="idType" value="0"></property> 

<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tbl_"></property>

<!--注入自定义全局操作     -->
<property name="sqlInjector" ref="mySqlInjector"></property>
</bean>

<!-- 定义自定义注入器 -->
<bean id="mySqlInjector"></bean>

总结

到此这篇关于Mybatis-plus sql注入及防止sql注入的文章就介绍到这了,更多相关Mybatis-plus防止sql注入内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • Mybatis-Plus通过SQL注入器实现批量插入的实践
  • Mybatis-Plus注入SQL原理分析
  • Mybatis-Plus的应用场景描述及注入SQL原理分析

我们今天的关于RegEx检测SQL注入检测sql注入工具的分享已经告一段落,感谢您的关注,如果您想了解更多关于(ZZ)SQL注入分析(手动注入检测) and 手动注入脚本命令精华版、asp.net下检测SQL注入式攻击代码、c# – 如何使用Regex检查参数?、Mybatis-plus sql注入及防止sql注入详解的相关信息,请在本站查询。

本文标签: