目录
SQL注入漏洞概述
SQL:是操作数据库数据的结构化的查询语言,实现对网页应用数据和后台数据库的交互。SQL注入是将表单域或数据包输入的参数,拼接成的SQL语句,传递给Web服务器,进而传给数据库服务器并得到执行,达到获取数据库信息的目的。如果Web应用程序的开发人员对用户输入的数据或Cookie等内容未过滤或者验证就直接传给数据库,就可能导致恶意的SQL语句被执行,进而获取数据库的信息,造成SQL注入攻击。
SQL注入漏洞产生的主要原因:
- 用户可以控制前端传给后端的参数。
- 传入的参数被拼接到SQL语句中,并被执行。
- 用户输入的参数未被验证或者过滤。
SQL注入的常用函数
1.concat函数
concat函数主要功能就是将多个字符拼接成一个字符串
- 语法:concat(str1,str2,......),返回的结果为连接参数生成的新字符串,如果有任何一个参数为NULL,则返回值就为NULL。
将数据表中多列数据排成一列,便于显示结果,concat_ws函数和concat函数类似,区别是concat—ws函数可以指定分隔符,其语法为:concat_ws(separator,str1,str2,...),需要注意的是分隔符不能为NULL,如果为NULL,则返回结果为NULL。group_concat函数也和concat类似,区别是group_concat函数主要用在含有group_by的查询语句中,将同一个分组的值拼接起来。
- 语法:group_concat({distinct}column{separator‘分隔符’})
2.length函数
length函数主要功能就是计算字符串的字符长度。
- 语法:length(str1),返回结果为字符串长度。
在SQL注入的过程中,经常需要计算字符串的长度,例如在不回显的场景下进行注入,一本被称为盲注,这种情况下需要逐一猜解字符,猜解过程中首先就要计算字符串长度。
3.ascii函数
ascii函数主要功能就是计算字符的sacii码值。
- 语法:ascii(char),返回结果为字符对应的ascii码值。
盲注的过程中需要逐一猜解字符,过程中需要计算ascii码,进行数值比较从而确定字符。
4.substr函数
substr函数主要功能就是截取字符串
- 语法:substr(string,start,length),其中string为字符串,start为起始位置,length为字符长度,返回结果为字符串。
盲注的过程中需要逐一猜解字符,过程中需要截取字符串中其中一个字符进行判断。
5.left、right函数
left函数主要功能也是截取字符串,默认从左截取。right同理
- 语法:left(string,length),其中string为长度,返回结果为子字符长度。
6.if函数
根据条件表达式的结果返回不同的值
- 语法:if(confition,value_if_ture,value_if_false),其中confition为条件表达式,value_if_ture,value_if_false分别是条件为真或假的时候表达的ture或flase作为条件返回的值
在SQl注入中,if函数和sleep函数结合使用,实现SQL注入中的时间盲注。
7.updatexml函数
改变文档中符合条件的节点的值
- 语法:updatexml(xml_document,XPath_string,new_value),其中xml_document为XML文档对象,XPath_string是XPath格式的字符串,报错注入时,需要写入错误的格式来显示错误的信息,new_valiue是string格式替换查找到符合条件的的数据,在注入时可以加入任意字符,执行XPath_string中SQL语句,获取相应的信息。
SQL注入过程中,若无数据回显,但是存在报错页面的数据回显,会用到报错注入中。
漏洞分类与利用
SQL注入漏洞种类有很多,按照数据类型分为数字型、字符型和搜索型;按照提交方式可分为GET型、POST型、Cookie型和HTTP请求头注入型;按照执行效果可以分为,报错注入,联合查询注入、联合查询注入、盲注和堆查询注入,其中盲注又可以分为基于布尔和基于时间注入。
1.基于联合查询的SQL注入
联合查询是合并多个相似选择查询的结果集,即将一个表追加到另一个表,从而实现将两个表的杳询结果组合在一起,使用关键词为union或union all。
基于联合查询的SQL注入是SQL注入的一种,既要满足SOL注入漏洞存在的一般条件,还要满足查询的信息在前端有回显。
基于pikachu平台,我演示一个完整的基于联合查询的SOL注入案例。

if(isset($_GET['submit']) && $_GET['name']!=null){
//这里没有做任何处理,直接拼到select里面去了
$name=$_GET['name'];
//这里的变量是字符型,需要考虑闭合
$query="select id,email from member where username='$name'";
$result=execute($link, $query);
if(mysqli_num_rows($result)>=1){
while($data=mysqli_fetch_assoc($result)){
$id=$data['id'];
$email=$data['email'];
$html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";
由第24~26行代码可知,后端基于GET方法,通过“name”变量接收前端传递的参数,由第28~31行代码可知,后端将接收到的参数未做任何过滤和处理,直接拼接到SQL语句中,并使用execute函数执行SQL语句获取数据,从而造成SOL注入漏洞,由第32~34行代码可知,后端将获取到的member数据表的id、emai字段的数据返回给前端。因此,可以利用基于联合査询的SQL注入进行攻击。
1.判断是否存在SQL注入点
输入kobe,查询出kobe的基本信息
输入kobe' and 1=1#,查询,也可以查询出kobe的基本信息
输入kobe' and 1=2#,不能查询出boke基本信息,可以判断出此处存在字符型的SQL漏洞。
2.判断查询数据表中字段的数目。
输入kobe' order by 2#,查询

最低0.47元/天 解锁文章
490

被折叠的 条评论
为什么被折叠?



