热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sql判断相等_Web安全:SQL注入漏洞

一次性付费进群,长期免费索取教程,没有付费教程。进微信群回复公众号:微信群;QQ群:460500587教程列表

 一次性付费进群,长期免费索取教程,没有付费教程。

进微信群回复公众号:微信群;QQ群:460500587

 教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍 

2c66d2caa05b8de7a77bea8fd5673967.png

微信公众号:计算机与网络安全

ID:Computer-network

SQL注入漏洞指攻击者通过构建特殊的输入作为参数传入Web应用。这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所需要的操作。其主要原因是程序没有细致地过滤用户输入的数据,导致攻击数据植入程序被当作代码执行。

我们通过SQL注入漏洞,可以得到目标站点的敏感数据(如数据库中的账号和密码、目标站点的绝对路径等)。然后,若条件允许,我们可以通过sqlmap交互式写shell,得到目标站点的shell。得到shell之后,可以下载目标站点的代码。此时,我们可以对目标站点的代码进行审计,判断是否有数据库连接敏感信息,是否有旁站,是否有权限进入旁站等。

我们现在已经知道SQL注入漏洞的原理了,接下来介绍MySQL的SQL注入。在此提醒下大家,别把SQL注入的对象弄错了,是MySQL(数据库)的SQL注入,而非网上流传的脚本注入,如PHP注入。要知道,SQL注入的本质是针对数据库而非脚本语言的。首先,在PHP中,两个单引号闭合的信息是字符串,两个双引号闭合的信息最终也是字符串。只是,程序会搜索双引号闭合的信息中是否有可执行的运算,如有,就执行运算,如没有,就不执行运算;而对于单引号,则不会去搜索,默认闭合的信息中全部都是不可执行的字符串。其实,双引号只比单引号多执行了一个搜索算法而已。这样看来,被单引号闭合的信息的执行效率还是要比双引号要高一些。所以,我建议大家用单引号闭合那些纯粹的字符串,用双引号闭合那些存在可执行运算的字符串。这是一个PHP编程的好习惯,例如以下代码。

$user = addslashes($_GET['a']);

$sql = "select host,user,password from user where user='$user'";

$res = mysql_query($sql);

$row = mysql_fetch_array($res);

var_dump($row);

事实上,在这段代码中,我们可以将$sql变量看作用双引号闭合的且存在可执行运算的字符串。当PHP的Lex或者Yacc解析到第一个双引号时,就会去找第二个双引号,两个双引号都找到之后,自然就明白了,原来这些信息都是被这对双引号闭合的。因此,继续按照双引号闭合的规则解析。规则为,搜索可执行运算,有则计算处理,没有则不计算处理;然后,将总的处理结果作为纯粹的字符串返回$sql变量中。

接下来介绍SQL注入分类,一般将SQL注入分为3类:数字型SQL注入、字符型SQL注入及搜索型SQL注入。在此,我们从另一个角度来深入了解SQL注入的本质并读懂SQL注入真正的内涵。例如,大家分析以下这段PHP代码有没有MySQL的SQL注入(DB是MySQL)。

$user = addslashes($_GET['a']);

$sql = "select host,user,password from user where user='$user'";

$res = mysql_query($sql);

$row = mysql_fetch_array($res);

var_dump($row);

看到这段代码,我们应该想到的是magic_quotes_gpc是否开启(没开启就只是利用addslashes函数在此转义,开启了这里就是双重转义);此处有没有MySQL的宽字节注入(考虑PHP与MySQL的代码是否一致);单引号与双引号在此处的含义。SQL注入测试文件sql_inject.php,其代码如下。

//连接数据库

$conn = mysql_connect('127.0.0.1','root','root');

mysql_select_db('mysql',$conn);

//$user = addslashes($_GET['a']);

$user = $_GET['a'];

$sql = "select host,user,password from user where user='$user'"; echo $sql;

echo '
';

$res = mysql_query($sql);

$row = mysql_fetch_array($res);

var_dump($row);

?>

开启浏览器,输入http://localhost:81/sql_inject.php?a=123' or '1'='1,Web服务器返回如下信息。

select host,user,password from user where user='123' or '1'='1'

array(6) { [0]=> string(9) "localhost" ["host"]=> string(9)

"localhost" [1]=> string(4) "root" ["user"]=> string(4) "root"

[2]=> string(41) "*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B"

["password"]=> string(41) "*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B" }

显示注入已经成功了,暴出了root。

host | user | password

localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

127.0.0.1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

其实,当我们输入123' or '1'='1并提交请求的时候,$sql变量的值也随着变成select host,user,password from user where user='123' or '1'='1'。这段语句就是SQL语句,由MySQL解析执行。其实您会发现,这段SQL语句执行后,已经把user表里所有用户的信息都查询出来了。我们来分析一下为什么会这样。问题就出在where条件语句中,即user='123' or '1'='1'。这句话的意思就是,只要user表中的user字段满足其值等于123或者'1'='1'的这个条件,就执行前面的select查询。大家仔细想想,这里的运算是不是有问题,运算结果是不是永远都返回为true。

我们可以先来了解下运算的优先级,其口诀为,先算术,后关系,再逻辑。其含义为,在逻辑表达式中,混有算术运算,要先进行算术(加减乘除)运算,再进行关系(大小比较)运算,最后进行逻辑(或、且、非)运算,得到真假(true或 false)结果。所以,在select host,user,password from user where user='123' or'1'='1'中,先进行算术运算,若无算术运算,则看关系运算,'1'='1' 就是关系运算。由于这两者相等,所以,这句关系运算结果返回true。此时,SQL语句就变成了select host,user,password from user where user='123' or true,我们继续进行关系运算,user='123'吗?user肯定不等于123,其实user=root,看看数据库就明白了。所以,这句关系运算的代码执行后返回false。此时,SQL语句又变成了select host,user,password from user where false or true, where条件语句里面就只有“false or true”这个条件了。这是什么运算?这已经是逻辑运算了,真或假运算的结果是真还是假,这里就不解释了。执行效果如图1所示。

3a4d72fb941b3b068b6dbc296b635c05.png

图1  执行SQL语句(1)

最后,来解释下这句SQL语句:select host,user,password from user where false or true。这句SQL语句中的false or true部分的执行结果是true。此时,这句SQL语句就变成了select host,user,password from user where true,where语句后面的条件始终是true。也就是说,条件始终都是真。我们的SQL语句执行的充分非必要事件就是where语句后面的条件恒为真。那么此时,执行select查询就是必然的事情了。这里可以列举C语言里面的一个循环语句来说明问题,它们如出一辙:where (true){//do something…},大家觉得它与此是不是一个道理呢?这样大家应该明白SQL注入的本质了吧?只要能构造出语法正确的SQL语句,注入不是难事。还有一点,需要明白3种运算的优先级关系。执行效果如图2所示。

58c92e5111bfb736aab03d20e29e7d96.png

图2  执行SQL语句(2)

例1:如果某站id参数存在数字型SQL注入漏洞,攻击者就能在浏览器(借助插件HackBar)中构造并提交攻击测试语句。然后发送至服务器,攻击测试语句为id=1) UNION ALL SELECT CONCAT(user()),NULL,NULL,NULL,NULL,NULL…。接下来,服务器返回敏感信息至浏览器,即数据库用户信息,信息为root@*.*.219.248,如图3所示。

96a659f16c62f74707977ad202fe20cc.png

图3  数字型SQL注入之敏感信息泄露

例2:如果某站fromCity参数存在字符型SQL注入漏洞,攻击者就能在浏览器(借助插件HackBar)中构造并提交攻击测试语句,然后发送至服务器。攻击测试语句为fromCity=6F9619FF-8A86-D011-B42D-00004FC964FF' UNION ALL SELECT user--?。接下来,服务器返回敏感信息至浏览器,即数据库用户名信息。数据库用户名信息为swwl,而且Web物理地址也泄露了,Web物理地址:F:\项目\,如图4所示。

3e1d54dfa03e141cb949810ed942eb40.png

图4  字符型SQL注入之敏感信息泄露

例3:如果某站doccatid参数存在搜索型SQL注入漏洞,攻击者就能在浏览器的搜索框中构造并提交攻击测试语句,然后发送至服务器。攻击测试语句为doccatid=(case when 1 like 1 then 1249014520765 end)。接下来,服务器将全部文章返回至浏览器,如图5所示。

5907079fabe34e7d4f6d7d9474eaa8c3.png

图5  搜索型SQL注入敏感信息泄露

可以看到,这里存在搜索型SQL注入。此时,攻击者使用Python编写EXP。通过EXP,攻击者可以查询出敏感信息(如当前数据库的用户等)。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】




推荐阅读
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
author-avatar
手机用户2502898397
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有