关于代码审计

2019年10月19日 0 作者 y1nhui

0x0001前言

啊,一如既往的前言,人太菜了,决定学学审计嗯
然后,其实这个文章是我做笔记用的,可能只有零星的东西(发现二号机上笔记软件被卸了的迫不得已。。。。。。)
感觉现在这个笔记最大的作用是整理一下知识,补一下残缺点

0x0002部分笔记

sql

模糊注入
通配符 %

文件包含漏洞

除了模块/板加载以外,还有cache调用(cache类似cookie,session也是一种身份识别方式)
同时,除了经常看到的get覆盖外,还有一种post数据流的方法
?a=php://input
然后post传入内容,如:<?php phpinfo();>(这是是不是能写入一个shell?)(翻了一下手册,似乎不行。。。)
这里延伸出来一个语法:php:// 访问各个输入输出流
大多数文件包含漏洞都是需要截断的。
因为有如include($file.'.php')这类写法,若想读取其他类型文件,则需要截断
1. %00截断
附上文章:https://blog.csdn.net/zhangzhuangtongxue/article/details/78198191 (5.3已修复)(这个地方被Threezh1大佬锤了嘤嘤嘤)
2. 多个.与/截断 (已修复)
3. 远程文件使用?进行伪截断

文件上传漏洞

文件头绕过
说一下getimagesize()函数,这个函数是获得图片尺寸,在过去这种函数的绕过我都是讲代码文件与一个图片使用cat进行合并上传的,结果刚刚看到了<font color="red">GIF89a</font>这个办法,即在文件开头写上GIF89a 它会正常返回一个图片的尺寸数组(但是我自己测试了一下似乎无效?)

代码执行漏洞

关于代码执行漏洞,之前我一直在纠结它到底能干什么,看个phpinfo?那好像没有意义,而挂上马的话,似乎只是载入 缓存,关闭浏览器就没了。
但是后来反应过来了,如果有一个代码执行漏洞,完全可以在其中构建一个全新的代码,如一个文件上传,直接把马传入,或者包含其他文件等。
这个标题底下,更多的是记一下函数。。。
1. eval与assert
这两个参数直接作为php代码
2. preg_replace
这个函数一般是在过滤里见到的,没想到可以执行代码
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &amp;$count ]] )
$pattern
$replacement
内存在修饰符 /e时, $pattern
$replacement
内的值会被当成php代码执行(可是好像没意义啊。。。这个是人家写入的,用户摸不到啊)
这里贴个网址:https://xz.aliyun.com/t/2557
3. 动态函数执行
这个就是如:
$_GET['a']($_GET['b']);
这样,直接引用函数就出了。。。。。。

命令执行漏洞

可用函数:system()、exec()、shell_exec()、passthru()、pcntl_exec()、pepen()、proc_open()
注: pcntl 是PHP的多进程处理拓展,需要额外安装。
pepen()、proc_open()不会返回结果,而是返回文件指针,不过没关系,因为命令还是执行了。
此外还有 反引号
不过反引号的应用前提是打开了PHP安全模式,这种情况下 反引号执行命令的方式是使用shell_exec()

变量覆盖漏洞

这个东西做ctf遇到了无数次,但一直是一知半解。。。。。。
首先是两个常见函数:extract() parse_str()
以及 $$
1. extract()
该函数的作用是将数组内的键值对注册成变量。本身是没有问题的,但是它的可选参数extract_type的默认值为:EXTR_OVERWRITE 即若变量名存在冲突,将原变量覆盖。
这也就导致了 我们先定义变量b=3,在数组a内又有b=5,extract一执行,b的值便会被覆盖,由b=3变成b=5
当然,如果可选参数使用了其他,就不一定会出现变量覆盖的现象了。
2. parse_str()
这个函数的作用是解析字符串并注册变量,并且在注册前不会验证该变量是否已存在。。。
当然,该函数也有一个可选参数,是数组,如果写上,注册的变量会放在该数组里。当然,如果存在相同键值它还是会覆盖。。。。。。

逻辑处理漏洞

逻辑漏洞千千万,我就写一些吧(感觉大部分逻辑漏洞都是程序员在摸鱼搞出来的(:з」∠)

语法漏洞

  1. in_arrary
    这个函数是判断输入值是否在某一数组列表内,理论上说不错,但是它会自动类型转换,然后 输入个1′ and 1=1 # 这样的,它还是会判断为正确(因为确实有1)。。。。
  2. is_numeric
    判断变量是否为数字,但如果是连接数据库的情况下我们传入了hex编码。。。。
    mysql可以直接识别hex编码,可能不能直接注入,但如果导入,在其他地方一调用就。。。。。。

  3. ==
    这个ctf也比较常见,即==与===
    ==比较前会进行类型转换,于是’1’==1 ‘1aaaa’==1 什么的也就成立了。。。
    而===不会转换,所以更稳

越权漏洞

越权嘛,水平越权和垂直越权,一个是偷用同级别身份的,一个是偷用上级身份的(:з」∠)
一般都是身份验证有问题搞得= =

未exit或return
有时使用if进行判断,若判断通过则在if内进行跳出。
然鹅如果没有将本来的函数/文件关闭,后续仍然会继续执行。

会话认证漏洞

。。。。。。发现没啥可以写的、但偏偏这个洞我不怎么会。。。
不过 cookie可以进行sql注入。。。