反序列化和sql注入以及litCTF签到题(第五周)
序列化和反序列化
链构造
逻辑性如链条一般,通过一个攻击点去找到另一条攻击点,层层溯源最终拿到漏洞,魔术方法可以作为其中的节点
把魔术方法作为最开始的小组件,然后在魔术方法中调用其他函数(小组件),通过寻找相同名字的函数,再与类中的敏感函数和属性相关联,就是POP CHAIN 。此时类中所有的敏感属性都属于可控的。当unserialize()传入的参数可控,便可以通过反序列化漏洞控制POP CHAIN达到利用特定漏洞的效果。
POP链小技巧
POP链常出现的函数
|
大写S可以支持字符串编码
|
s:4:"user"; -> S:4:"use\72"; |
深浅copy
在php中如果我们使用 & 对变量A的值指向变量B,这个时候是属于浅拷贝,当变量B改变时,变量A也会跟着改变。在被反序列化的对象的某些变量被过滤了,但是其他变量可控的情况下,就可以利用浅拷贝来绕过过滤
|
$A=&$B; |
利用php伪协议
session反序列化漏洞

PHP在session存储和读取时,都会有一个序列化和反序列化的过程,PHP内置了多种处理器用于存取 $_SESSION 数据,都会对数据进行序列化和反序列化,PHP中的Session的实现是没有的问题的,漏洞主要是由于使用不同的引擎来处理session文件造成的。
pchar反序列化漏洞利用
需要搭配文件上传使用,先生成一个phar文件,里面存入我们想要实现的序列化对象,然后上传到对方服务器,利用phar伪协议读取上传的phar文件(前提是读取界面存在不规范的魔术方法,利用该魔术方法去构造POP链,生成我们想要的序列化对象)

phar文件生成
|
Plain Text |
生成的.phar文件可以改为任意后缀,不需要怕指定后缀上传
字符串逃逸
减少
出现str_replace等字符串替换函数,如果替换后字符长度减少,则可能出现字符串逃逸_减少的问题,可以吞掉一个成员属性,然后修改该成员属性对应的键值构造一个符合题目要求序列化对象
增加
同上,但是替换后字符长度增加,可以用第一个对象属性构建后续想要的对象属性的内容,然后多次添加过滤项把真实的后续属性给挤压掉
SQL注入
一般的sql注入顺序都是先构造闭合,判断可以的注入方法,然后依次爆数据库,爆表,爆列
构造闭合要判断该查询数据是数字型还是字符型
- 优先判断数字型,直接让系统做加减法,如果系统计算了结果就是数字型,如果没有计算,显示的内容是第一个数字的查询结果就是字符型
- 然后判断字符型,可以用如下payload尝试
|
Plain Text |
如果页面出现报错,在用--+ 注释符号加在payload后面,观察是否页面恢复正常,如果正常则代表闭合成功
联合注入
- 在闭合成功的基础上利用order by判断表的列数
|
Plain Text |
- 知道列数之后再用union联合查询判断回显位,还要把查询位的id赋值为表中没有的数字或者让查询结果出错
|
Plain Text |
- 查看回显位,如果只回显1,则在1这里构造查询命令
下面是常见的查询命令
暴库
|
Plain Text |
爆表
|
Plain Text |
爆列
|
Plain Text |
获得数据
|
Plain Text |
报错注入
常用函数updataxml(),extractvalue(),floor(),exp();
updatexml函数在执行时,第二个参数应为合法的XPATH路径,否则会在引发报错的同时将传入的参数进行输出
可以构造类似下面的语句来查询数据
|
Plain Text |
extractvalue和updataxml类似,只是它只有两个参数,也是在第二个参数的位置构造语句
|
Plain Text |
报错回显通常有长度限制(一般长度为32字节),我们可以利用limit也可以利用substr去逐一读取内容
|
Plain Text |
盲注
布尔盲注
|
SQL |
时间盲注
|
SQL |
脚本(不可直接使用)
- 偷拿一下学校战队的脚本
|
Python |
WAF绕过
空格-->内联注释/*!*/,%09,%0a
"="-->like
长度限制-->substr,mid,right,lift,limit
替换-->双写绕过
or-->"^"
","-->substr((select database ()) from 1)
"!="-->"<>"
Writeup
我只想要你的PNG!
- 打开F12能发现check.php,flag在根目录,这是存心诱惑我呢

- 打开文件夹只能上传图片格式说明存在前端验证,找到它然后删除


- 抓包上传修改MIME类型,无法上传,可能是白名单验证

- 把文件名改为png也无法上传,猜测可能是判断文件头

- 这个是后缀名和文件头一起检测,有点难搞
- 看提示发现check.php会记录上传的文件名,这是真有你的,还以为多难的题

- 出师未捷身先死,windows操作系统命名无法出现<>,只能开个虚拟机去创建文件了,请忽略我文件名的错误

- 上传文件后访问check.php,对应的代码就被执行了

- 不知道什么原因我用cat /flag无法直接查看flag,所以这里我用蚁剑连接后接查看flag

- 原来是过滤了flag,好好好,这里还阴我一手

第十三章 通幽关·灵纹诡影
- 开始提示对上传文件后缀,大小,文件头都有要求

- 点击上传文件发现只能传.jpg后缀,所以是前端限制,打开F12,删除对应代码即可


- 然后构造符合文件大小和文件头判断的图片码,文件后缀直接用.php就行

- 上传后给了地址

- 直接用蚁剑连接

- 在根目录下找到flag


第十四章 御神关·补天玉碑
- 非常明显的黑名单限制,尝试phtml被过滤

- 在尝试.htaccess,发现成功上传,那就好办了,构建.htaccess文件是所有文件名里带有shell的文件都用php解析器去解析


- 然后上传shell.jpg的图片马,然后又给了地址

- 用蚁剑连接

- 在根目录下找到flag


第十五章 归真关·竞时净魔
- 需要条件竞争,但是我的burp是社区版,线程不够,无法完成
第十七章 星骸迷阵·神念重构
- 代码很简单,先构建相应序列化对象


- 通过eval去实现ls系统命令找到flag在根目录

- 换成读取flag的命令即可


[NSSRound#4 SWPU]1zweb
- 非预期解
|
Plain Text |
- 既然有查询文件,那就尝试一下index.php读取文件源码

- 读取成功,拿到源码

- 存在upload.php,在读取一下upload.php的源代码

- 这里即存在文件头检测也有后缀名检测,在构建phar文件时还需要考虑__wakeup的绕过,先来构造一个phar文件,构造完后修改一下对象属性值绕过__wakeup
|
Bash |
- 看题解发现因为动了原phar的文件内容而该文件的签名没有变,所以后面利用伪协议解析的时候时成功不了的,找了一个py代码修改一下文件签名
|
Python |

- 把这个文件进行zip压缩,然后把压缩后的文件名改为白名单中的类型即可绕过文件头过滤


- 通过phar://伪协议去访问.jpg文件里面的.phar

- 尬住了,继续查阅资料,发现不能用记事本直接修改数据,要不然即使修改了签名也会自动改变,所以全流程都需要用.py代码
|
Python |

- 然后直接用phar://访问上传文件即可


[NSSRound#4 SWPU]1zweb(revenge)
- 和上一题差不多,这不过在index.php中加了flag过滤,无法用非预期解目录遍历去解题了


[SWPUCTF 2023 秋季新生赛]UnS3rialize
|
Bash |
- 根据魔术方法的原理理清大致顺序是:F->T->C->NSS,然后去构建相应的序列化对象
|
Bash |
- 然后根据情况修改$n->cmd即可,但是不知道为什么我这里明明已经触发了__invoke却无法成功,可能是环境问题

- 我的问题,忘记绕过__wakeup了,修改了一下php代码,用str_replace替换相应对象属性大小,然后再用ls /去寻找flag

- 然后访问/flag即可


sqli-labs
1
- 先猜闭合方式,发现是但引号,说明是字符型注入
|
Plain Text |


- 再用orderby猜列数,3正常,4报错,说明列数为3

- 在判断那些列数是显示在页面上的,还要把1改为-1让数据库查询不到

- 后续进行正常爆库,爆表名,爆列名即可




2
- 这关是数字型注入,因为试了单引号,双引号,加括号等方法发现无法闭合,但是直接联合注入发现成功

- 判断数字型注入还可以用加减法,如果实施了运算且成功访问就是数字型,没有运算就是字符型


- 后面的步骤和上一题一样就不重复了
5
- 是单引号闭合,但是页面不会显示列的相关内容,尝试报错注入

- 报错注入成功,那么在database()栏这里修改成对应的注入语句即可

- 由于报错注入的回显有长度限制,可以利用limit去逐行阅读

- 也可以用substr限制长度


-
其他语句同第一题
6
- 同上一题,由单引号闭合变为双引号闭合

[SWPUCTF 2021 新生赛]sql
- 题目提示参数,随便输入一个数试试,显示name和password


- 判断闭合时出现前端验证,打开F12把它删了就行
|
Plain Text |

- 好像找不到,换个注释方式试一下,成功闭合
|
Plain Text |

- 判断列数(有空格过滤,就用内联注释绕过),有3列
|
Plain Text |

- 判断回显列
|
Plain Text |

- 获得数据库名(无法直接用group_concat一次性获得所有数据库名,这里我用limit逐个获取,总共5个)
|
C++ |

- 用test_db试一下有没有flag,这里"="被过滤了可以用like代替,而且输入参数对长度有要求,不能同时查两个值
|
C++ |

- 在这个表中找flag
|
C++ |

- 获得flag数据,还是个残废品,服了
|
C++ |

- 找没有过滤的截取字符段的函数,其中mid可用
|
Plain Text |

[极客大挑战 2019]BabySQL
- 先用万能密码尝试登录
|
Plain Text |

- 根据提示or被过滤,那就双写or尝试一下

- 成功登录,接下来就是正常流程,然后找过滤函数,用双写绕过即可
- 判断列数为3列
|
Plain Text |

- 判断回显列
|
Plain Text |

- 获得数据库
|
Plain Text |

- 获得ctf中的表
|
Plain Text |

- 获取flag中的列
|
Plain Text |

- 获取flag
|
Plain Text |

06 第六章 藏经禁制?玄机初探!
- 万能密码直接获得flag
|
Plain Text |

LitCTF writeup
Ezsql
- 这题尝试加减法判断是字符型注入

- 利用单引号和双引号和空格去尝试闭合,都没有用,突然想起在hnusec里面看到的宽字节注入,去除魔术反斜杠的方法,在引号前加%df,成功闭合
|
Plain Text |


- 接下来就是逐步获得信息了,先获得列数,直接根据题目提示尝试5和6,得出列数为5
|
Plain Text |


- 获得数据库名
|
Plain Text |

- 获得表名
|
Plain Text |

- 获得列名
|
Plain Text |

- 获得flag
|
Plain Text |

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)