图书馆

注意到 read.php 摆明了有 SQL 注入。关键在于 bypass 过滤。

不会 SQL 注入的同学请看 Lilac web 培训 - SQL注入

核心代码:

<?php 

$id = $_GET['id'];

if(preg_match("/[ ]|select|SELECT|union|UNION|from|FROM|group|GROUP|where|WHERE/", $id)) {
    die("请停止恁的攻击行为并向就近的公安机关自首");
}

$sql = "SELECT * FROM literature WHERE id = $id";
$result = $conn->query($sql);

首先通过 ORDER BY 来判断出一共有多少列。有些教程建议利用 UNION SELECT NULL,NULL,NULL,...NULL,通过不报错时 NULL 的个数来判断有多少列,我的评价是瞎折腾。除非 ORDER BY 不能用,否则我无法推荐后一种做法。

过滤空格,用 /**/ 绕过。例如 ORDER/**/BY/**/

过滤 selectSELECT,用 sELeCt 绕过。

爆表名,爆列名,注出 flag 就行了。