0×01概述:
SQLite的,是一款轻型的数据库。sqlite存在一个叫SQLITE_MASTER的表,这与MySQL5.x的INFORMATION_SCHEMA表类似。sqlite_master 表中保存了数据库中所有表的信息,该表中比较有用的字段有“name,sql”,name字段存放的是表名,sql字段存放的是表结构。可以通过内置函数sqlite_version()获取版本信息,和其他数据库一样,通过“order by”判断长度,该数据库的注释符和ORACLE数据库一样,都是–。
0×02使用参数:
0×03:信息获取
通过自定义函数SetPoc,根据功能需求,设置各发包的PoC,比如猜测“order by”长度,获取版本信息,获取表名,获取表中字段名,以及字段的具体内容。
首先判断注入类型,是整型(123和555 = 555–),字符型(123′和555 = 555–),还是搜索型(123%’和555 = 555–),再通过二分法判断“order by”长度,如果一开始插入order by mid(尝试的长度)的包返回状态和正常的原始包返回状态不相等,则说明mid过大,如果原始正常包返回状态与插入的order by mid和order by mid + 1的包返回状态相等 ,则说明mid过小,如果原始正常包返回状态与插入order by mid的返回包状态相等,但与order by mid + 1的包返回状态不相等,则成功获取order by长度。
通过上步获取的order by长度,再调用内置函数sqlite_version(),获取版本信息,poc类似%’ and 1 = 2 UNION SELECT null,sqlite_version() ,Sqlite数据库的字符型、搜索类型注入,和Oracle数据库一样,可以通过使用null进行注入。这里将发送包分成三部分进行拼接,第一部分是类似123%’ and 1 = 2 union select null,sqlite_vetsion(),这部分将根据要查询的信息进行变化,如查询所有表名,则使用123%’ and 1 = 2 union select null,name;第二部分则根据前面获取的order by 长度,补齐缺少的null,第三部分则根据要查询条件进行修改
通过调用count(1)可获取数据库中表的总数,通过查询系统表SQLITE_MASTER中的name字段,可获取数据库中所有表名,这和MySQL数据库中系统表INFORMATION_SCHEMA中的“table_name”字段类似。通过limit关键字指定获取信息的开始位置和数量,比如limit 0,1,则是从第一条开始,并且只获取一条数据
sqlite_master表和mysql数据库中系统表information_schema不一样的是,sqlite_master不存在类似“ column_name”的字段,但是她有一个sql字段,该字段保存了各个表的结构,包括表名,字段名和类型 。因此可以通过查询sql字段获取各个表的列名 。
通过前面获取的表名和列名,再获取具体内容,类似的poc为123%’ and 1 = 2 UNION SELECT null,column_name,null from table_name–。
0×04:SQL注入防御
1,使用白名单或者黑名单进行全局过滤,防止二次注入
2,强制使用预编译,参数化语句,如JSP的PreparedStatement的setString方法等
3,前端JS过滤,如调用escape方法
4,借助第三方安全防御软件,如WAF
领取专属 10元无门槛券
私享最新 技术干货