发布于12月5日12月5日 ##0x00 OWASP 前10 名 OWASP(开放Web应用程序安全项目)是一个开源、非盈利、全球性的安全组织,向所有致力于提高Web应用程序安全性的人们开放,旨在提高应用程序安全意识。其最权威的是《10个最严重的Web应用安全风险清单》,总结并更新了Web应用中10个最有可能、最常见、最危险的漏洞。是开发、测试、服务、咨询人员应该了解的知识。 ##0x01 前言 时隔多年,2021 年OWASP Top10 已经发布。最近正好想回去巩固一下基础知识,所以趁这个机会看一下新的Top10。与2017版相比,有以下变化。下图取自OWASP官网: 从图中不难看出,2017年和2021年版本中排名前10的漏洞,按照A1到A10的顺序依次为: OWASP Top10 2017OWASP Top10 2021注入攻击权限控制失败无效的身份验证和加密机制无效的敏感数据泄露注入攻击XML 外部实体漏洞(XXE) 不安全设计无效的访问控制安全设置缺陷安全配置错误危险或过时的组件跨站脚本(XSS) 身份验证和验证机制失败不安全反序列化漏洞无效的软件和数据完整性故障使用具有已知漏洞的组件安全日志记录和监控无效的日志记录和监控服务器端请求伪造 对比报告,我们发现注入攻击一直位居前列。注入攻击在2013年版的Top 10报告中也排在这两个报告之前,可见其危害性。接下来我们就结合靶场和常见的防御、绕过来学习SQL注入,注入攻击的一种。 ##0x02 简介 SQL注入是一种将恶意代码插入到字符串中,然后传递到数据库实例进行分析和执行的攻击方法。应该检查构成SQL 语句的任何过程是否存在注入漏洞,因为数据库将执行它收到的所有语法上有效的查询。攻击者可以操纵参数化数据。我们经常会遇到B/S架构的业务系统。通常这些业务系统通过以下接口来调用数据库的内容:URL、用户登录框、留言板、搜索框等,往往正是这些接口会给我们带来安全风险。所以,为了你,为了他,也为了大家,我写一篇关于SQL注入的文章。 ##0x03 原理 SQL 注入的主要形式涉及将代码直接插入到与SQL 命令连接的用户输入变量中并允许执行它们。间接攻击将恶意代码注入到要存储在表中或作为元数据的字符串中。当存储的字符串随后连接成动态SQL 命令时,恶意代码就会被执行。 注入过程的工作原理是提前终止文本字符串并附加新命令。由于插入的命令可能会在执行前附加额外的字符串,因此攻击者会用注释标记“--”来终止注入的字符串。执行后,后面的文本将被忽略。 **0x04 数据库介绍** ##0x04 注入分类 ###参数类型分类 #### 数字注入 数字注入,顾名思义,就是当输入参数为整数时,如果恶意构造的payload存在注入漏洞,则属于数字注入。 **稍后将使用SQL-Labs 作为示例** 正常访问页面显示正常 ```` http://10.211.55.27/少-2/?id=1 `` 在id参数后添加单引号`''`可以显示错误,可以作为判断是否存在SQL注入的依据。 ```` http://10.211.55.27/少-2/?id=1%27 `` 在参数id后面添加“and 1=1”。页面显示正常。 ```` http://10.211.55.27/Less-2/?id=1%20and%201=1 `` 将and 1=1 替换为and 1=2。页面显示异常。据此可以判断是数值类型。 ```` http://10.211.55.27/Less-2/?id=1%20and%201=2 `` 我们再看一下代码部分。红框中的SQL语句直接作为函数传入执行。 `$id`部分没有使用单引号,表示是数字类型 #### 字符注入 字符类型注入的特点是参数是字符类型,即用单引号括起来的`''`字符串。 和数字类型一样,加单引号看看是否报错。这是。 ```` http://10.211.55.27/少-1/?id=1%27 `` 字符注入需要注意符号闭合。这里我们添加注释符号\\-\\-\\+,此时返回正常。 ```` http://10.211.55.27/小于-1/?id=1%27--+ `` 这里的字符类型代码在参数$id的位置多了一个`''`。这不一定是上面例子中的关闭方法。以下是一些常用的,可以根据实际情况进行修改。 ```` ?id=1'--+ ?id=1\'--+ ?id=1')--+ ?id=1\')--+ 等等。 `` ###注射部位分类 #### GET 注入 GET可以理解为通过HTTP的GET方法进行注入攻击。这里使用Hackbar插件通过GET方式发送payload 。 #### 后注入 POST是注入攻击的POST方法。这种方法通常在用户登录框比较常见。这里我们用BP抓取一个POST数据包来看一下。如果输入随机密码,则登录失败。 还有一点我们这里使用的是**通用密码** `admin'or'1'='1` 这里我们可以使用通用密码成功登录 在这里查看登录框的代码。我们插入的payload`admin'or'1'='1`组成的$sql查询语句是这样的,这样就可以直接登录,无需密码验证。 ```` 从用户中选择用户名、密码,其中用户名='admin'或'1'='1'且密码='$passwd' LIMIT 0,1 `` #### 其他HTTP 注入 ##### 饼干 Cookie注入是指注入点在请求头的Cookie字段中。 BP 捕获数据包并查看。 `Cookie: uname=admin` 我们给cookie添加单引号,返回的包提示数据库查询出错 使用`--+`注释,返回正常,说明有Cookie注入 ##### 用户代理 用户代理简称UA。一般网络请求都会携带这个东西。它标识了您自己的一些计算机信息、用户信息、应用程序类型、操作系统和软件版本号。这些信息组合成一个字符串信息。其中包括以下HTTP头的注入,这在实战中很少遇到。这里我简单解释一下原理。 好的,我们用SQL-Lab来演示一下。正常输入账号密码登录,抓包,查看UA头。这是正常的。 添加单引号看看效果。可以看到SQL语句报错,证明存在SQL注入。 接下来我们关闭语句,发现回显正常,这导致UA头的SQL注入。 ##### 推荐人 Referer的主要作用是表明一个来源信息。例如,如果我们点击www.baidu.com指向www.google.com的链接,那么Referer header中就会有一个www.baidu.com标记,表明我们来自百度URL。有些业务系统会验证Referer头的内容,这可能会导致SQL注入。按照旧规则,BP 抢走了这个包。 正常请求包,回显正常Referer头信息 在其后面添加单引号并查看。报告错误。这些HTTP headers的注入是类似的。实战中很少遇到,所以可以作为了解。 ###注射技术的分类 上面我们已经确定了SQL注入的类型和位置。接下来我们就来看看一些常用的注入技术。 #### 联合查询注入 一般先确定注入类型,然后用order by查询表的列数。 order by是SQL语句中的关键字,用于对查询结果进行排序。 order by关键字用于对结果集按照一列或多列进行排序。默认情况下,记录按升序排序。如果要按降序排序,可以使用DESC 关键字。 这里我们判断一下列号。如果是1、2、3、4,就会报错。如果是1、2、3就正常了。这证明这个表只有3列。 ```` http://10.211.55.27/Less-1/?id=1%27%20order%20by%201,2,3%20--+ `` 这里有回声。我们可以直接使用union query来注入union select。 union查询的作用是在原始查询条件的基础上,通过关键字union来拼接select语句。这里注意原来的id=1为false,修改为id=-1。这是为了返回一个空表,方便union select查询到的数据拼接显示。另外要注意的是,两个select语句返回的字段必须相同,否则无法正常拼接。 ```` http://10.211.55.27/Less-1/?id=-1%27%20union%20select%201,2,3%20--+ `` 这里的两个显示位显示2和3,这样我们就可以利用这两个显示位来枚举我们想要的数据。这里是一个显示数据库版本的测试。同理可以回显其他查询结果 #### 堆栈注入 顾名思义,堆栈注入就是将多个SQL语句堆叠在一起执行。 SQL语句根据`;`判断语句是否结束。堆栈注入是多条语句之间用“;”分隔的注入方式。由于可以执行多条SQL语句,所以优点是显而易见的。与上面的联合查询相比,可以进行更多的增、删、改、查询等操作,但也有缺点。例如,某些场景会限制多语句操作的执行,修改数据库的操作可能需要更高的权限。 正常页面显示 参数后面加单引号会报错。使用以上联合查询即可拨通 看一下显示位置 ```` http://10.211.55.27/Less-38/?id=-1%27%20union%20select%201,2,3%20--+ `` 查询数据库表名 ```` http://10.211.55.27/Less-38/?id=-1%27%20union%20select%201,2,数据库()%20--+ `` 检查表名。总共有4张桌子。 ```` http://10.211.55.27/Less-38/?id=-1%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%20--+ `` 检查字段名称,获取用户帐户,然后使用堆栈注入自己添加帐户。 ```` http://10.211.55.27/Less-38/?id=-1%27%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27%20--+ `` 获取用户账号密码,查看Dumb Dumb ```` http://10.211.55.27/Less-38/?id=-1%27%20union%20select%201,2,group_concat(用户名,%27|%27,密码)%20from%20users%20--+ `` 接下来我们将使用堆栈注入来修改他的帐户“Dumb111” ```` http://10.211.55.27/Less-38/?id=-1%27;%20update%20users%20set
创建帐户或登录后发表意见