web安全之SQL注入(一)

文中详细讲解web安全之SQL注入,通过文中内容更加深入的掌握SQL注入的原理及检测方法,从而更好的用于渗透测试中;文中内容全由个人理解编制,若有错处,大佬勿喷,个人学艺不精;本文中提到的任何技术都源自于靶场练习,仅供学习参考,请勿利用文章内的相关技术从事非法测试,如因产生的一切不良后果与文章作者无关。

web安全之SQL注入(一)

SQL注入漏洞介绍

Web程序代码中对用户提交的参数未做过滤就直接放到SQL语句中执行,导致参数中的特殊字符打破SQL语句原有的逻辑,让攻击者可以利用该漏洞执行任意SQL语句。

Burp中CO2联动SQLMAP检测

在Burp中安装插件CO2,然后进行配置SQLMAP的路径,python路径可选填写,抓包发送:
在这里插入图片描述
配合SQLMAP出进行检测出结果:
在这里插入图片描述

MYSQL注入基础知识

在MYSQL5版本以后,MYSQL默认数据库中多了information_schema这个库,在这个库中重点有三张表,columns 、tables、SCHEMATA 表字段 CHEMA_NAME 记录着库的信息,从而我们攻击者可以利用这个库,逐步获取所需要的信息。
SCHEMATA表 记录了所有的数据库名:
在这里插入图片描述
columns存储该用户创建的所有数据库的库名、表名和字段名
在这里插入图片描述
tables里面TABLE_SCHEMA 、TABLE_NAME 字段分别记录着库名和表名
在这里插入图片描述
所以当我们在这里跨库查询时,这可以执行这些命令:

select * from information_schema.columns where TABLE_SCHEMA='dvwa'

在这里插入图片描述
如果需要继续查users里面的,那么我们就可以继续在后面加上TABLE_NAME:

select * from information_schema.columns where TABLE_SCHEMA='dvwa' and TABLE_NAME='users'

在这里插入图片描述
因此通过这些介绍,我们就更加的清楚当我们进行注入时,为何要使用这些参数来获取数据。

SQL注入原理

SQL注入漏洞产生需要满足两个条件:1. 参数用户可控:从前端传到后端的参数内容是用户可以控制的;2. 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。

select * from users where id=1'
select * form users where id='1''

当用户使用单引号来进行检测时,不论是字符型还是整形,只要报错都说明此处有可能存在注入。
在这里插入图片描述
在这里插入图片描述
当我们使用与运算,and 1=1 来判断时:

select * from users where id=1 and 1=1 

在这里插入图片描述
从下图我我们可以看出select 1=2 返回0,在MYSQL中,就相当于false。就是没有数据,则是我们通常说的为假。
在这里插入图片描述
反之select 1=1 返回1,就相当于true,则为真,所以上面我们使用与运算时,两边都为真,就返回正确页面给我们,一边为假,则为假,没有数据返回给我们,我们就可以通过此原理来进行判断是否存在注入。

select * from users where id=1 and 1=2

在这里插入图片描述
那我们在页面进行判断时,首先要进行区分是整形还是字符型。

字符型

如果是mysql的数据库,我们使用’1’=‘1’ 则需要使用–+或者–空格来进行注释,主要的作用就是为了闭合,但根据不同浏览器,有的浏览器并不会解析+号,所以多数用–空格,或者直接使用#号来进行注释。

?name=vince' and '1'='1'--+&submit=1

我们使用’1’='1,则后面就不需要加注释。

?name=vince' and '1'='1&submit=1

整型

使用则不需要在后面的判断中加上单引号,只有字符型才是需要的。

id=1 and 1=1&submit=1

在这里插入图片描述

id=1 and 1=2&submit=1

在这里插入图片描述
这是在有回显的时候,我们对SQL注入漏洞的简单判断,同样我们也可以使用or来进行判断:

id =1 and 1=1
id = 1 and 1=2
id = 1 or 1=1
id = '1' or '1'='1'
id=" 1 "or "1"="1"

当没有回显的时候,我们最简单的判断就是利用sleep函数。

?name=vince%27+and+sleep%285%29--+&submit=%E6%9F%A5%E8%AF%A2 #在burp中需要进行url编码才能执行

在这里插入图片描述
直接在浏览器中也可以同样看到加载的时间,从而判断是否存在注入
在这里插入图片描述

SQL注入的流程

判断字段数:

order by

确定回显点:

union select 1,2

查询操作系统版本、数据库信息:

@@version  
@@datadir  

查询用户名、数据库名、操作系统版本:

user() database() version() #当这些函数被过滤,可以使用上面的方式来获取信息。

文件读取:

union select 1,load_file('C:\\windows\\win.ini')

写入webshell

select..into outfile

SQL注入修复建议

代码层最佳防御SQL漏洞方案,就是采用sql语句预编译和绑定变量。

  • 所有的查询语句都使用数据库提供的参数化查询接口;
  • 对进行数据库的特殊字符进行转义处理,或编码转换;
  • 确认每种数据的类型,例如数字型的数据就必须是数字,且数据库中存储的字段也必须对应是int;
  • 数据的长度严格规定,能在一定程度下防止较长的SQL注入语句无法正确执行;
  • 网站的每个数据层的编码统一,建议全部使用utf-8,防止因上下层编码不一致而被绕过。
  • 严格限制用户对数据库的操作权限,从最大限度下减少注入攻击。
  • 避免网站显示SQL错误信息,防止攻击者利用错误信息进行判断,在网站调试可以展示给管理员,但一旦不需要调试就要关闭显示。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全局变量Global

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

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

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

打赏作者

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

抵扣说明:

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

余额充值