【第九天 - 数字型 SQL注入】

Q1. SQL 注入 是什麽?

  • SQL 注入攻击也称为 SQL injection,网页有许多功能都需要资料库,例如会员登入、购物车等,都需要工程师在网页前端收到使用者的资料,储存於资料库,以便未来使用者登入输入帐密时,可以检查是否帐密正确。

  • 而工程师在编写程序时,对於检查「使用者的输入」不够严格,可能输入的内容被程序以为是 SQL 语法,进而绕过检查机制或泄漏机敏资料

  • 资料库类型有许多种,有 MySQL、Access、Microsoft SQL Server等,不同的资料库类型,会有不同的注入语法。

  • 参考资料:https://www.slideshare.net/hugolu/sql-injection-61608454

Q2. 数字型 SQL 注入是什麽

  • 是指使用者输入数字,资料库会根据使用者输入的数字,查询相关第N笔资料

    • 例如有个会员ID查询表,你输入 ID 会回传该会员的基本资讯,而你的目标是将所有资料 dump 出来
      https://ithelp.ithome.com.tw/upload/images/20210923/20140592PAo58mKkIu.png
  • 通常数字型的 SQL 注入点会搭配其他手法来进行 SQL 注入,例如 UNION

Q3. 为什麽会有 数字型 SQL 注入漏洞?

假设今天欲从资料库中,依据 id 进行查询 news,则查询 id 为 1 的 news 所使用的 SQL 语法如下:

SELECT `title`, `content`
FROM `news`
WHERE `id` = 1;

以 PHP 为例,若网页後端要从 MySQL 查询 news,则需将指定的 id 嵌入 SQL 语法,再送给 MySQL 服务器执行。最简单的写法如下:

$res = mysqli_query($conn, "SELECT title, content FROM news WHERE id=".$_GET['id']"); 

https://localhost/news?id=1 为例,上述程序码中的 $_GET['id'] 会取得 URL 中的参数 id ,因而合并後的字串为 "SELECT title, content FROM news WHERE id=1" 。然而,由於程序没有检查 $_GET['id'] 是否为数字,若攻击者输入网址 https://localhost/news?id=1 OR 2 > 1 ,则会构建出如下的 SQL :

SELECT `title`, `content`
FROM `news`
WHERE `id` = 1
	OR 2 > 1;

由於 2 > 1 恒真,资料库就会将所有 news 都回传。

由此可见,若网页程序没有检查从 Client 端传来的资料,便将其嵌入 SQL 语法,攻击者便可能插入额外语法,藉此改变程序行为。结合明天将介绍的 UNION ,甚至可能将整个资料库的资料尽数泄漏出来。

Q4. SQL 注入的检查工具

  • SQLMap
  • jSQL Injection
  • BBQSQL

参考资料:https://zhuanlan.zhihu.com/p/139737334

Q5. SQL 注入常发生的地方

  • 会将使用者输入资料传送给 database 的地方
  • 会员登入
  • 留言区
  • GET 网址
  • 部落格
  • 公告

Q6. 检查是否有数字型 SQL 注入

  • [https://localhost/news?id=1](https://localhost/news?id=1) 可以在 id=1 的地方改成 id=3-2,看是否会进行计算
    • 若得到 id=1的结果,代表会根据输入的资料进行运算,代表可能是一个数字型注入
    • 如果页面改变为 id=3 的样子,表示网页程序可能有对输入转型为数字,因此後面非数字的字串没有生效。
    • 如果页面出现错误,或者无法正常显示内容,表示网页可能有检查输入,或者为非数字型 SQL 注入。

参考资料:https://blog.csdn.net/weixin_43749051/article/details/114295081


<<:  #08 实作篇 — 使用 Next.js 的各种 Data Fetching 方式实作小专案 ft. Github API

>>:  [Day21] 在 Codecademy 学 React ~ What's this? This is "this"! 之 this.props 篇

Day.15 「条件设定好~让程序判断!」 —— JavaScript 条件判断式

前面学习了基础的变数与运算子的使用,这些基础往往是非常枯燥乏味的,还没有与电脑有更进一步的互动,所...

Day12 CSS基础设定介绍_1

文字及字体 文字大小及字体是我们在网页中最常设定跟调整的,在预设的字体中你可能找不到你想要的字体类型...

【心得】CSS-transform vs.relative 今天要吃哪一道呢~

前言 position 里面有一个属性叫 relative,可以让物件根据原本的位置进行移动 tra...

Spring Framework X Kotlin Day 2 3 Tier & Simple CRUD

GitHub Repo https://github.com/b2etw/Spring-Kotlin...

Day 11: 人工智慧在音乐领域的应用 (机器学习/深度学习与类神经网路二)

机器学习简介 (Machine Learning, ML) 机器学习是一种透过资料、特徵撷取以及训练...