图书馆
注意到 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 就行了。