1.常见数据库的类型-payload,注入方法
access,mysql,mssql,postgresql,oracle,mogodb
其中最常见的是asp+access,php+mysql,python+mogodb
2.常见数据库的分类-权限提升
对于注入和权限提升的关键,根据是非有root账户分类的话,access没有root账户,剩下都是有的
3.sql注入常见的出现地方-注入点
只要运用到数据库操作的地方都有可能出现sql注入的位置
黑盒情况下:通过功能判断是否有数据库操作
白盒情况下:1.功能 2.代码操作的追溯
4.数据库的基本结构-payload
库->表->列->data
在access中,只有一个数据库,而其他的数据往往有多个数据库,通过创建不同的用户,让不同的数据库用户只能查看和操作相关的数据库,root账户则可以统一管理所有的数据库
5.采用最简单的注入点手工注入,不同的数据库的格式概述
1.access
一般采用社工爆破的方式
当只知道表不知道列的时候,用偏移注入
2.mysql
在mysql5.0以上可以通过imformation_schema去查询相关的表,列名
3.postgresql
只有部分语法和mysql不同,也有相关的表
详细可以看PostgreSQL的information_schema_ITPUB博客
4.oracle
大致的的语法相同,oracle在手工注入查询是有一个dual虚表
5.mogodb
在注入时需要按照一定的格式进行提交才可以让数据传输成功
6.数据的提交方式
get,post,cookie,request,server
get在url上直接可以看见提交的位置t
post需要用hackbar提交
cookie,server需要抓包之后去修改数据包提交
request是get和post都传输提交
7.数据的基本类型-决定注入语句
数字:不用单引号
字符型:双引号和单引号括起来的,在写语句闭合的时候要加上
搜索型:‘%s%’经常用于一个搜索框的select匹配工作,在闭合的时候要先闭合%’+语句--过滤
没办法过滤的时候使用判断的方式去做%’+语句+and ‘%’=‘
编码型:在数据的传输过程中采用了编码方式,前端编码提交,后端解码处理,这个时候需要查看编码类型进行提交payload
格式型:提交的数据具有格式要求,如json
8.sql非直接注入的常用手法
1.盲注
当前页面没有回显的时候使用
延时:用if+sleep和判断去做,没有条件限制
布尔:left等等,条件是需要有判断的标准
报错:利用原本网站代码中就用的报错代码error函数,条件是具有报错的代码
2.宽字节注入
当一个注入点采用了在某些字符前面加/的方式过滤的时候使用
最常见的是在php中的addslash()和在配置文件中开启magic_gpc,让我们在闭合某一个注入点时变成/',让一个语句无法闭合,我们可以采用在前面加入%df,例如%df’union select...,在过滤的时候就会变成%df/’union select... 在解析这个语句时就会把%df和/去结合在一起从而达成闭合的目的
3.二次注入
当没有明显可以回显的地方,我们输入的数据被放置到数据库中,在其他地方再次被用到,从而查询信息
原理:我们可以控制变量的输入,服务器再次采用这个变量进行输出
常见场景:前面有一个输入变量A的insert语句,把变量A插入了一个数据库的表,后面有select语句对于该表进行了输出
思路:我们可以改变什么->数据库修改了->服务器输出了显示
4.堆叠注入
在mysql,mssql,postgresql数据库中可以用;分割语句,让两个语句分开执行
5.DNSlog
当一个网站没有回显,或者一个防火墙对于部分的协议进行了过滤的情况下使用,一般的网站对于DNS是不进行过滤的
一般可以使用DNSlog网站DNSLog Platform
原理:DNS是域名解析服务,目的是让目标反过来去访问你给出的网站,用执行语句+我给出的网站
条件苛刻:必须要在目标注入点上可以使用load_file()这样的高权限语句
但是都可以用这样的语句了,不都可以直接命令执行了吗
9.sqlmap工具注入
sqlmap是sql注入最常用的工具,用起来很简单,也很无脑
sqlmap是基于python开发的,所以先需要配置一个Python的环境,然后在python目录下使用python启动,安装就直接在github上面下载就可以了
在windows上面用cmd打开
这样就是打开成功了,最常用的就是以下几个
把带有注入点的url地址复制到sqlmap上,会自动排查sql注入点,分析有可能使用的数据库类型
查是否带注入点:sqlmap -u “网址”
查所有数据库:sqlmap -u “网址” --dbs
查当前数据库:sqlmap -u “网址” --current-db
查指定库的所有表名:sqlmap -u “网址” -D “数据库名” --tables
查询指定库指定表所有列名:sqlmap -u “网址” -D “数据库名” -T “表名” --columns
查看指定数据库指定表指定列的数据:sqlmap -u “网址” -D “数据库名” -T “表名” --C “列名” --dump
sqlmap是非常好用的sql注入工具,但是不是万能的,一切功能都还是基于最简单的手工注入,只不过比手打效率更高而已,在面对很多情况下,sqlmap是不能直接告诉我们的,比如输入值是编码型,或者格式等等情况,这个时候我们需要自己先做出判断再去拿脚本跑
在sqlmap下的temper目录就提供了这些脚本应对不同的情况
在使用的时候我们为了sqlmap更准确可以用提交抓到的数据包的方式,在注入点加上?示意
10.小tips
1.在输入语句没回显的情况下,可以看一下是否有报错语句,可以尝试去加报错让语句回显
2.在绕过过滤的时候mysql支持16进制的语句输入解析
3.在白盒审计的时候,我们尽量去试包含了目的语句触发页面
11.我的sql注入例子
持续更新中,感兴趣的不如收藏这个帖子,关注我鸭