在1998年12月的《Phack》第54期,名为rfp的黑客发表了一篇名为“NT Webs Technology Vulnerabilities”的文章,随后一种在OWASP TOP10排行榜霸榜多年名为SQL注入的漏洞来到了世人的眼前
原文地址:http://phrack.org/issues/54/8.html
SQL注入基础
SQL语言介绍
SQL全称是“结构化查询语言”,最早是IBM为关系数据库系统SYSTEMR开发的一种查询语言,SQL语言结构简洁,功能强大,简单易学,所以IBM于1981年推出后得到了广泛的应用。
结构化查询语言SQL是一种介于关系代数与关系演算之间的语言,其功能包含查询、操纵、定义和控制,是一个通用功能极强的关系数据库标准语言
SQL注入产生原因
由于B/S模式随着互联网的高速发展,被应用的越来越广泛,而开发人员水平和经验参差不齐,在编写代码的时候没有对用户的输入数据或页面中所携带的信息进行必要的合法性判断,攻击者利用这个机会提交一段数据库查询代码,根据程序返回结果即可获得部分数据库信息
SQL注入原理
SQL注入是一种将恶意的SQL代码插入或添加到应用(用户)的输入输出的攻击手段,攻击者探测出开发者编程过程中的漏洞,利用这些漏洞构造SQL语句,对数据库内容进行直接的检索或修改
灵活的SQL查询语句+用户输入的数据代入了SQL语句=用户操作数据库->SQL注入漏洞
案例演示
SQLi-LABS源码:https://github.com/Audi-1/sqli-labs
PHP环境安装SQLi-LABS,并且打开SQLi-LABS的数据库
show databases; #显示已有数据库
use security;#进入SQLi-LABS的数据库security
show tables;#查看已有数据表
select * from users;#查看数据表users所有内容
select username,password from users where id=1;#查看数据表users中id=1的username,password列内容
select version();#使用内置函数version()查看数据库版本
在注入中有一个函数叫做union,作用是联合查询,常被用于数据库注入
select username,password from users where id=1 union select 1,version();
这里需要注意的是,我们要符合列数对应,两列内容必须对应两列,否则就会报错
所以我们这里添加单独查询1(查询1会直接返回1)来占位,结果第一行返回了id=1的username,password和第二行返回了查询1的结果和mysql版本号
为了更直观的演示,我们打开SQLi-LABS Less-1的index.php,直接跳转到20行与29行
我们发现在20行获取了传入id之后,没有经过任何的处理,就直接把放进了sql语句中进行应用,并且在33行开始返回结果
如果我们正常传入数字id的话,将会输出id所对应的username和password的值
limit 0,1指的是从第0条开始返回一条记录
我们现在已知传入时候代码会被无过滤的放到id=的后面,所以我们构造一个联合查询,查询版本号,同时将’ limit 0,1使用注释符注释
select * from users where id='1' union select version(),1,2;#' limit 0,1;
我们在浏览器中构造url
http://127.0.0.1/Less-1/?id=1%27%20union%20select%20version(),1,2;%23
因为#通常会用在编码中,所以直接使用#会报错,%23是#的编码
我们发现语句被正常执行了,但是由于网页输出只输出一行的原因没能被输出出来
那我们就让第一行报错,报错就不执行了,而且数据库第一列是id,网页中也是不输出的,所以我们把他version()和1换个位置
重新构造URL
http://127.0.0.1/Less-1/?id=-1%27%20union%20select%201,version(),2;%23
输出成功
大致流程如下图
-1%27%20union%20select%201,version(),2;%23
输出成功
[外链图片转存中...(img-5fBP2NCI-1598410666629)]
大致流程如下图
![image-20200627173107083](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9za3lzdGFycnktMTI1MTE1NzI0Ny5jb3MuYXAtY2hlbmdkdS5teXFjbG91ZC5jb20vaW1nL2ltYWdlLTIwMjAwNjI3MTczMTA3MDgzLnBuZw?x-oss-process=image/format,png)