2021-06-06 · 4

LOS #1 gremlin write-up

securitypwnable

这篇文章发布已超过两年,内容可能已过时。


什么是 LOS..?

这个 LOS(Lord Of SQLInjection)是一个可以练习 SQL Injection 的 Web 黑客练习网站。

关于 SQL Injection,请读这篇 [黑客/Web 黑客] - SQL Injection ~嘿。

解题过程

因为是第一关,逐行解读的话,14 行不太需要,从第 56 行开始解读……

if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

一个我们不认识的 "preg_match" 映入眼帘,这是什么呢?

什么是 preg_match?

在 PHP 中用 preg_match 函数编写正则表达式

第一个参数:编写正则表达式,

第二个参数:要搜索的字符串,

第三个参数:返回数组变量。把模式匹配中匹配到的值以数组形式保存。

什么是正则表达式?

请读 [黑客/Web 黑客] - 正则表达式 / 常用正则表达式

因此,当用户输入的 id 值中存在 'prob'、''、'.'、'\' 这些值时,会出现 "No Hack ~~" 的画面。

而且看上面的 PHP 语句,可以看出输入是用 GET 方式接收的。用 GET 方式接收时,输入值会直接暴露在参数(URL)里。

$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";

第 7 行是我们见过很多次的 SQL 语句。是从数据库中查找所输入 id 和 pw 对应的值并存入 $query 的查询语句。

echo "<hr>query : <strong>{$query}</strong><hr><br>";

第 8 行的作用是把那条查询语句展示给我们!

$result = @mysqli_fetch_array(mysqli_query($db,$query));

第 9 行是把输入的 $query 值以数组形式存入 $result 的查询语句。

if($result['id']) solve("gremlin");

第 10 行似乎是:如果 $result ['id'] 里有值,就执行 solve("gremlin")。

解题过程

再看一遍这段文字,是当 $result ['id'] 为真时就能解开的题!插入值的方法是在 URL 末尾写 "? id=值&pw=值" 这样。

那么就照前面学的试试 SQL Injection 吧?每个人得出的答案千差万别,无论用什么方法只要 Clear 就是正确的方法。用各种方法试试看!

$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";

看这条查询语句,如果我们输入 id=1234 pw=1234,就会变成 select id from prob_gremlin where id='1234' and pw='1234'

会像这样被输入。那么写 ' or 1=1 %23 呢?

select id from prob_gremlin where id='' or 1=1 #' and pw=''

如上 id 变为真,这题就会被 clear。

%23 是什么?

写 %23 时输出的咖喱句……我是说查询语句,你那边显示成什么样了?

应该像这样显示成了 #。这叫 URL encoding。

什么是 URL 编码?

URL 编码(Encoding)

  1. 一种把字符或特殊字符转换成 Web 服务器和浏览器普遍接受形式的机制。
  2. URL 只能用 ASCII 字符集在互联网上传输。
  3. 由于 URL 常包含 ASCII 集之外的字符,所以 URL 必须转换成有效的 ASCII 格式。
  4. URL 编码把不安全的 ASCII 字符替换为 "%" 后跟两个十六进制数字。
  5. URL 不能包含空格。URL 编码中一般把空格替换为 (+ 号)%20

如上,%23 表示 #。用 # 的原因——看过我 SQL Injection 博客的人应该知道——是为了把后面的部分全部注释掉。

你可能会问 "'--' 不是注释吗?" 那也在我博客里 因为这里用的是 MYSQL,所以注释是 #。-- 在 Oracle、MSSQL 中生效。

就这样我们通关了第 1 关 gremlin!!!辛苦了~

+其他解法、小技巧

简单地把 id 和 pw 值都变为真就能解开。

  1. id=' or '1'='1&pw=' or '1'='1
  2. pw=' or 1=1%23
  3. id=' or id='1' and pw='1' or 1=1%23

如上可以得出多种解法!

URL Encoding 值可以通过网上的表和编码一个个确认,也可以通过网站获取。

例如可以通过 https://meyerweb.com/eric/tools/dencoder/ 这样的网站获取。

参考:

https://choseongho93.tistory.com/131

https://webkid.tistory.com/2


原文(韩语): tistory — 发布于 2021-06-06,已迁移至本博客。本翻译由 AI 协助完成。

评论

删除这条评论?

相关文章

LOS #1 gremlin write-up · 나봄하랑