周记4-SQL基础,pop链,php变量绑定
SQL注入基础
漏洞
何为sql注入?简单来说就是攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作
例如对于一些安全性较低的登录页面,因为这些用户的数据都是存储在数据库中,那么就可以进行SQL注入来查询敏感信息或者做更多恶意操作
mysql数据库结构
mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有数据库存在的字段名。columns_schema字段下是所有表名对应的数据库。了解这些对于我们之后去查询数据有很大帮助。
mysql数据库常用默认的端口为3306
SQL语句
在进行SQL注入之前,我们肯定要学习一下SQL语句,接下来介绍一些常用的语句和基本语法
1 | 启动运行mysql: |
注入流程
- 查找注入点
- 判断是字符型还是数字型(注入and 1=1 1=2 或者 3-1类似方式)
- 若是字符型,找到闭合方式
- 判断查询列数长短(group by 或者 order by)
- 查询回显位置(查询-1)
pop链
利用PHP中对象的自动调用魔术方法特性,将多个类和方法串联起来,形成一个链式调用.当PHP反序列化时,会自动调用这些方法,触发代码执行
而在此重点就是PHP中的魔术方法,正好总结下
接下来通过一道ctf例题解析一下pop链的解法和思路
1 |
|
首先这类题一定是要先找到能进行命令执行或文件包含的地方,那么我们发现在Modifier类中有一个方法内有可以产生文件包含漏洞的函数include(),那我们的思路就是想办法触发魔术方法来调用append方法,并且传给value的值为’flag.php’
不难发现我们需要触发__invoke()这个魔术方法来调用append方法,并且传给value的值为这个类中的var值,那么后面的poc中var值就要为’flag.php’,但要触发这个魔术方法,需要将对象当作函数调用
那么接下来为了触发__invoke()魔术方法,如何将Modifier对象当作函数调用,观察接下来的代码,我们发现在Test类中的__get()魔术方法中return部分可以实现把对象当作函数调用,且需要将赋给$function的$p为Modifier实例,即$p=new Modifier(),那么触发这个魔术方法需要调用这个类中属性不存在或不可访问属性的成员
继续,为了触发__get()魔术方法,我们要继续利用其他方法来实现触发,发现在Show这个类中的__toString()魔术方法中存在连续的引用,那么我们可以将这个类中的$str的值赋为Test对象,因此这个魔术方法内的这句话return $this->str->source;就成为了调用Test对象中的source成员了,又因为Test类中没有source这个成员,所以实现引用Test对象中不存在的成员,触发__get()魔术方法,那么又该如何触发__toString()魔术方法来实现这样的过程呢
那么要触发__toString()魔术方法,要将Tset对象作为字符串调用,依旧是去寻找能实现这种过程的部分,发现在这个类中存在__wakeup()魔术方法,其中我们可以利用echo函数来将Test对象作为字符串调用,那么只需要将source值赋为new Test(),并触发__wakeup()魔术方法就能实现,最后一步就是触发这个魔术方法了
最后,只需要进行反序列化操作,__wakeup魔术方法就会被调用,那么层层递推,就实现我们的需要了
总结一下:通过上面的分析,最后大致总结下来就是一个这样的过程:
分析后编辑好POC并进行序列化(url编码) >> 将结果传参,进行反序列化 >> 触发__wakeup >> 触发__toString >> 触发__get >> 触发__invoke >> 最后成功利用文件包含,得到答案
这种环环相扣,层层递进的过程就是构造pop链,最后展示一下POC以更好理解:
1 |
|
补充
之前做到一题发现自己知识的缺口,现在做出补充
在php反序列化时如果要把一个类中成员的值赋给另一个成员需要用到引用符,和C语言取地址意义相似,例如:
1 | $c = new CLazz(); |