图书馆
注意到 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/**/。
过滤 select 和 SELECT,用 sELeCt 绕过。
爆表名,爆列名,注出 flag 就行了。