SQL注入与libinjection分析(4)源码分析之整体框架解读


SQL注入与libinjection分析系列:
MYSQL命令大全
https://blog.csdn.net/lqy971966/article/details/104922862
SQL注入与libinjection分析(1)SQL注入
https://blog.csdn.net/lqy971966/article/details/105269658
SQL注入与libinjection分析(2)Libinjection
https://blog.csdn.net/lqy971966/article/details/105273753
SQL注入与libinjection分析(3)源码分析之一些重要的结构体说明
https://blog.csdn.net/lqy971966/article/details/106195224
SQL注入与libinjection分析(4)源码分析之整体框架解读
https://blog.csdn.net/lqy971966/article/details/106857168
SQL注入与libinjection分析(5)源码分析之指纹函数fingerprint和查找函数lookup_word剖析
https://blog.csdn.net/lqy971966/article/details/106902216
这篇主要对 libinjection_sqli 函数,即整体框架进行解读,分析。

1. 整体框架解读

libinjection 做了一个假设,它假设黑客只能通过三种方法来进行sql攻击

  1. 直接注入sql语句
  2. 在单引号内注入sql
  3. 在双引号内注入sql

1.1 直接注入sql语句

libinjection_sqli_fingerprint,无引号,标准SQL语法

1.1.1 分析

  1. 判断用户输入的字符串长度是否合法,为零则返回FALSE。(即没有发现SQL注入)

  2. 执行SQL注入识别函数(libinjection_sqli_fingerprint,无引号,标准SQL语法),获取字符串识别特征码

    2.1 执行结构体内的查询函数(这里为libinjection_sqli_lookup_word,二分查找算法),对比第二步获取的识别特征是否与SQL注入识别特征匹配。
    如果第三步发现SQL注入特征匹配结果为真,则返回true,并将SQL注入识别特征匹配到的fingerprint写入结构体,

    2.2 如果检测失败,则调用reparse_as_mysql()函数判断是否存在“(dash-dash-[notwhite]) 注释”或“’#’ 运算符号”,如果存在则再次执行SQL识别函数(libinjection_sqli_fingerprint,无引号,MYSQL语法),

1.1.2 代码解读

	/* 入口 参数:输入字符串,长度 输出指纹结果 */
	libinjection_sqli(input, slen, fingerprint)

	/* 
		初始化 libinjection_sqli_state 
		主要是赋值指纹/令牌查找回调函数 libinjection_sqli_lookup_word 
	*/
	libinjection_sqli_init 

	/* 判断输入sql语句是不是 sql注入 */
	libinjection_is_sqli 

		/* 
			执行SQL注入识别函数 libinjection_sqli_fingerprint,
			无引号,标准SQL语法
			获取字符串识别特征码/令牌 
		*/
		libinjection_sqli_fingerprint(sql_state, 
						FLAG_QUOTE_NONE | FLAG_SQL_ANSI); 	
	
		/* 
			执行结构体内的查询函数 libinjection_sqli_lookup_word 
			对比获取的识别特征是否与SQL注入识别特征匹配。
		*/
		sql_state->lookup
	
			/* 
				如果发现SQL注入特征匹配结果为真,则返回true,
				并将SQL注入识别特征匹配到的fingerprint写入结构体 
			*/
			return TRUE;
		
			/* 
				如果检测失败,则调用 reparse_as_mysql 
				函数判断是否存在“(dash-dash-[notwhite]) -- 注释”
				或“’#’ 运算符号” 
			*/
			reparse_as_mysql
		
				/* 
					如果存在则再次执行SQL识别函数 libinjection_sqli_fingerprint
					无引号,MYSQL语法 
				*/
				libinjection_sqli_fingerprint(sql_state, 
						FLAG_QUOTE_NONE | FLAG_SQL_MYSQL)
				sql_state->lookup
			
					/* 如果发现,则返回true */
					return TRUE;

1.2 在单引号内注入sql

libinjection_sqli_fingerprint,单引号,标准SQL语法

1.2.1 分析

如果前面的判断没有返回结果,将扫描参数(即用户输入的字符串)查找是否存在单引号。如果为真接着重复上述检测步骤。

1.2.2 代码解读

	/* 如果前面的判断没有返回结果,将扫描参数(即用户输入的字符串)查找是否存在单引号。*/
	memchr(s, CHAR_SINGLE, slen)
		
		/* 
			如果存在则次执行SQL识别函数 libinjection_sqli_fingerprint,
			单引号,标准SQL语法 
		*/
		libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_SINGLE | FLAG_SQL_ANSI);
		sql_state->lookup
	
			/* 如果发现,则返回true */
			return TRUE;
		
			/* 
				如果检测失败,则调用 reparse_as_mysql 函数判断
				是否存在“(dash-dash-[notwhite]) -- 注释”或“’#’ 运算符号” 
			*/
			reparse_as_mysql
			
			/* 
				如果存在则再次执行SQL识别函数 libinjection_sqli_fingerprint,
				单引号,MYSQL语法 
			*/
			libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_MYSQL)
			sql_state->lookup
			
				/* 如果发现,则返回true */
				return TRUE;

1.3 在双引号内注入sql

libinjection_sqli_fingerprint,双引号,标准SQL语法

1.3.1 分析

  1. 如果前面的判断依旧没有返回结果,将扫描参数(即用户输入的字符串)查找是否存在双引号。如果为真则接着执行SQL注入识别函数
    (libinjection_sqli_fingerprint,双引号,MYSQL语法)
  2. 同时执行结构体的分析函数(libinjection_sqli_lookup_word,二分查找算法)进行特征匹配检测结果为真,则返回true,并将SQL注入识别特征匹配到的fingerprint写入结构体

1.3.2 代码解读

	/* 如果前面的判断没有返回结果,将扫描参数(即用户输入的字符串)查找是否存在双引号。*/
	memchr(s, CHAR_DOUBLE, slen)
	
		/* 
			如果存在则次执行SQL识别函数 libinjection_sqli_fingerprint,
			双引号,标准SQL语法 
		*/
		libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_DOUBLE | FLAG_SQL_ANSI);
		sql_state->lookup
	
			/* 如果发现,则返回true */
			return TRUE;

参考

源码托管在在github上:
https://github.com/Audi-1/sqli-labs

https://zhuanlan.zhihu.com/p/44292411
https://zhuanlan.zhihu.com/p/44537204
https://www.anquanke.com/post/id/86097

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值