信息收集是渗透的最重要的一步,它决定你渗透能否成功的%60.
对于SQL注入,前期需要了解对方~数据库的类型~,~网站路径~,为后续测试SQL注入提供一个正确的道路。
目前网站数据库类型主流的有mysql、Access、Mssql、mongodb、Postgresql、sqllite、oracle等等。
与其他类型注入不同,属于独立存在管理类型。
(1)不存在跨库注入;
(2)无文件读写操作;
(3)无版本、数据库可以查,直接获取数据;
(4)注入的时候只能够靠猜或爆破数据,例如user、username、pass、passwd、password等。
方法:可以使用Accesss偏移注入,随机爆数据;(百度上可以查到相应文章)
mongoDB与其他数据库的不同点再与它参数的接受方式为类似”键值对“的方式获取。例如:
{
id 1
user admin
passwd admin
}
接受参数方式有点类型python的字典以及json注入。
(1)可以跨库查询;
(2)可以文件读写操作;(如果对方写入权限允许的情况下,直接写入一句话获取shell)
(3)获取版本、表名、列名、数据。
有时候对方网站对GET请求方式做出过滤,而忽略了其他请求方式的注入,那么我们可以更换提交方式进行注入获取数据。
我们渗透一个网站时,需要根据对方的功能大致判断其背后的SQL语句,这样我们的注入语句也会相应的变化。
一般在查询功能模块会用到。
一般在注册,添加功能模块的时候会用到。
一般在删除功能模块的时候会用到。
一般在更新功能,如修改密码的时候会用到。
具体的注入过程可以查看网站的相关文章。
三种注入方式测试优先级:报错注入 > 时间注入 > 布尔注入
最快的一种注入。配合查询方式注入,快速的获取对方数据库信息。
最慢的一种注入。主要用到的函数有:sleep()、if()、Length()、mid()、substr()、ascii()、limit 0,1.
思路:通过if函数的三目运算符来判断数据库信息的名字,优先使用length函数来猜长度。由于是无回显,所以使用sleep函数,通过页面的睡眠时间来得知我们的判断正不正确。
最麻烦的一种注入。主要用到的函数有sleep()、if()、Length()、mid()、substr()、ascii()、limit 0,1.
思路:使用二分法配合ascii函数能更快速的判断。
注册一个 admin'# 的用户,如果可以成功注册,那么在更新操作时,用户名进入数据库的格式为 username = 'admin'#' ,等于修改了admin的密码。
二次注入大多在白盒测试中判断,无法使用工具进行测试。
对方网站的参数使用了加密算法,我们需要先解密后再注入语句,再进行加密测试。
如果是sqlmap工具,可以调用--tamper base64encode.py --dbs,工具自带的插件。
也可以直接开发一个脚本工具,使用sqlmap测试本地的脚本,实现一个编码中转。
工具:https://gihub.com/ADOOO/Dnsloglinj
工具运行环境:python
工具使用方式类似sqlmap工具。
DNSlog使用条件,高权限用户,解决了盲注不回显数据的问题。
原理:SQL语句中,分号;是一条语句结束的意思。如果可以实施多条语句,那么就可以实现堆叠注入。
例如:?id=1;select * from user;
使用场景:当我们注入成功获取管理员的账户密码时,如果密码我们无法解密成功,那么我们就可以使用堆叠注入,插入一条我们自定义账户密码的用户,从而实现成功登录。
注意:当然,堆叠注入不仅仅用户插入数据,还可以删除、更改、查询数据。
常见的waf软件有:阿里云、宝塔、安全狗、D盾
(1)大小写
(2)等价函数
(3)特殊符号
(4)加解密、编码解码
(5)反序列化
(6)注释符混用
(1)参数污染
例如:浏览器的参数污染
(2)注释符
例如:database/**/()
(1)和(2)配合使用
例如:id=1/**&id=-1%20union%20select%201,2,3%23*/
(3)换行绕过(%0A表示换行、%23是#)
(4)fuzz大法(使用python脚本运行)