CTF中遇到的php

1.if(eregi("hackerDJ",$_GET[id])) {   //eregi字符串对比

echo("<p>not allowed!</p>");

exit();

2.isset 判断变量是否定义过

3.比较符

$a==$b   松散比较

===      完全等于

=        大于等于

!=       如果类型转换后$a不等于$b,Ture

!==      不完全等于,如果$a不等于$b或者它们类型不同,Ture

当php进行一些数学计算的时候,当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。

1 var_dump(0 == ‘0‘); // true

2 var_dump(0 == ‘abcdefg‘); // true

3 var_dump(0 === ‘abcdefg‘); // false

4 var_dump(1 == ‘1abcdef‘); // true

* bool类型的true跟任意字符串可以弱类型相等

在某些情况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。比如: ‘3‘ == ‘3ascasd‘结果为true。

4.eval可以直接执行php代码

5.intval   将变量转成整数类型

6.ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。

int ereg(string pattern, string originalstring, [array regs]);

例,$email_id = "[email protected]";

$retval = ereg("(\.)(com$)", $email_id);

ereg()限制password的格式,只能是数字或者字母。但ereg()函数存在NULL截断漏洞,可以使用%00绕过验证。

这里ereg有两个漏洞:

①%00截断及遇到%00则默认为字符串的结束

②当ntf为数组时它的返回值不是FALSE

7.strpos — 查找字符串首次出现的位置:

例,$mystring = ‘abc‘;

$findme   = ‘a‘;

$pos = strpos($mystring, $findme);

8.$_GET可以接受数组但MD5

md5()不能处理数组结构的数据

利用此漏洞构造index.php?a[]=1&b[]=2

构造?a[]=1&b[]=2这样md5函数无法处理数组返回false完成匹配得到flag

例,

if (isset($_GET[‘a‘]) and isset($_GET[‘b‘])) {

if ($_GET[‘a‘] != $_GET[‘b‘])

if (md5($_GET[‘a‘]) === md5($_GET[‘b‘]))

die(‘Flag: ‘.$flag);

else

print ‘Wrong.‘;

}

9.<?php

if($_POST[user] && $_POST[pass]) {

mysql_connect(SAE_MYSQL_HOST_M . ‘:‘ . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);

mysql_select_db(SAE_MYSQL_DB);

$user = trim($_POST[user]);

$pass = md5(trim($_POST[pass]));

$sql="select user from ctf where (user=‘".$user."‘) and (pw=‘".$pass."‘)";

echo ‘</br>‘.$sql;

$query = mysql_fetch_array(mysql_query($sql));

if($query[user]=="admin") {

echo "<p>Logged in! flag:******************** </p>";

}

if($query[user] != "admin") {

echo("<p>You are not admin!</p>");

}

}

echo $query[user];

?>

看见括号了没,我一直没看见··········

最简单的注入 和password无关

user=admin ‘)# //注意括号要闭合不然报错 我就是被坑的。

10.PHP对于这个@符号,之前很少在意,只知道它是错误屏蔽的符号

11.一般形式:strcmp(字符串1,字符串2)

说明:

当s1<s2时,返回为负数 注意不是-1   true

当s1==s2时,返回值= 0              false

当s1>s2时,返回正数 注意不是1      true

11.strlen    判断字符串长度

例,else if (strlen($_GET[‘password‘]) < 8 && $_GET[‘password‘] > 9999999)

科学记数法,由于要使密码长度小于8或值大于9999999,可以使用1e8或1e9满足条件。

12.文件包含漏洞

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。

同时我也借此机会学到了文件读取的相关知识。

include “test.php”php文件包含,在执行流中插入写在其他文件中的有用的代码。读取的时候也是数据流形式,因此可以使用php://filter进行过滤,返回值为0,1。

readfile(“test.php”)是将文件以数据流的形式读取过来,并不会执行,但会在前台浏览器上进行解析。返回值是字节数多少。

file_get_contents(“test.php”)返回值为文本内容

此题运用的就是关于数据流过滤的文件包含,我们一般在进行文件包含的时候都这么写include “test.php”获得的就是test.php直接解析出来。但如果运用readfile(“test.php”) 就不进行解析,导致无法在浏览器前台进行显示。那么问题来了看题

简单的重复一下他的意思

注解:

1.php://filter/可用于处理打开的数据流,起到过滤作用。如果源文件为.php则很有可能在前台显示不出来。

2.此时我们采用的方法是,先让文件转化为base64格式(convert.base64-encode)然后再输出,这样不论是什么格式的文件都可以在前台输出。

3.再次解码就可得到源代码,怎么样是不是很神奇啊!

例http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

13.extract 变量覆盖

总的来说是extract() 函数从数组中将变量导入到当前的符号表,典型的变量覆盖。

例,

<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>

<?php

extract($_POST);

if ($pass == $thepassword_123) { ?>

<div class="alert alert-success">

<code><?php echo $theflag; ?></code>

</div>

<?php } ?>

<?php } ?>

if ($pass == $thepassword_123) { ?>

只需要覆盖$pass、$thepassword_123这两个变量使他们相等即可。

14.php上传截断

15.set_time_limit(0);

括号里边的数字是执行时间,如果为零说明永久执行直到程序结束,如果为大于零的数字,则不管程序是否执行完成,到了设定的秒数,程序结束。

16.PHP变量覆盖

extract() 函数从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

 

<?php
 if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
    extract($_POST);
    if ($pass == $thepassword_123) {
        echo $theflag;
    }
?>

在第三行, 运用了extract()函数, 将POST方式获得的变量导入到当前的符号表中.

然后判断$pass 与$thepassword_123两个变量的内容是否相等.

但是, 由于extract()函数的不足之处, 导致这段代码存在一个变量覆盖漏洞.

只要我们这样构造url

/?pass =&thepassword_123=

那么, 我们可以发现, $pass 变量和$thepassword_123变量的内容都会被设置成空字符串.这样就使得两个变量被覆盖。

17.PHP超全局变量

$GLOBALS — 引用全局作用域中可用的全部变量

$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。

PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

例,

<?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET[‘args‘])){
    $args = $_GET[‘args‘];
    if(!preg_match("/^\w+$/",$args)){
        die("args error!");
    }
    eval("var_dump($$args);");//这里涉及超全局变量的使用
}
?>

构造特殊url:http://120.24.86.145:8004/index1.php?args=GLOBALS

 

 

时间: 2024-11-10 13:55:24

CTF中遇到的php的相关文章

CTF中那些脑洞大开的编码和加密

0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下.本来是想尽快写出参考的文章,无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没有提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧! 0x01 目录 1 2 3

CTF中怎么看phpinfo

CTF中怎么看phpinfo 在比赛中经常遇到phpinfo,这个页面可以看到很多配置信息,我们需要在这么多信息中,着重看一下几个内容: 1.allow_url_fopen和allow_url_include  其中配置作用是这样的: allow_url_fopen =On(允许打开URL文件,预设启用) allow_url_fopen =Off(禁止打开URL文件) allow_url_include =Off(禁止引用URL文件,新版增加功能,预设关闭) allow_url_include 

CTF中ZIP总结

记录一下我在CTF中遇到的ZIP的部分解法,可能不是很全 ZIP伪加密 0000H~002DH(灰色区域)为压缩源文件数据区,002EH~008FH(桃红区域)为压缩源文件目录区,0090H~00A5H(黄色区域)为压缩源文件目录结束标志. 识别真假加密 无加密 压缩源文件数据区的全局加密应当为00 00 压缩源文件目录区的全局方式位标记应当为00 00 伪加密 压缩源文件数据区的全局加密应当为00 00 压缩源文件目录区的全局方式位标记应当为09 00 真加密 压缩源文件数据区的全局加密应当为

CTF中常见Web源码泄露总结

.hg源码泄漏 漏洞成因: hg init的时候会生成.hg e.g.http://www.am0s.com/.hg/ 漏洞利用: 工具:dvcs-ripper rip-hg.pl -v -u http://www.am0s.com/.hg/ .git源码泄漏 漏洞成因: 在运行git init初始化代码库的时候,会在当前目录下面产生一个.git的隐藏文件,用来记录代码的变更记录等等.在发布代码的时候,把.git这个目录没有删除,直接发布了.使用这个文件,可以用来恢复源代码. e.g. http

如何在CTF中当搅屎棍

论如何在CTF比赛中搅屎 0×00 前言 不能搅屎的CTF不是好CTF,不能搅屎的题目不是好题目. 我很赞成phithon神的一句话,"比赛就是和他人竞争的过程,通过各种手段阻止对手拿分我觉得也是一种能力." 你能够做到别人做不到的,那就是你的本事. 本文所说的搅屎是在GETSHELL的情况下才能进行的!!!遇到phithon师傅的<CTF主办方指南之对抗搅屎棍>就GG了 0×01 预备知识 大多数能够搅屎的题目基本上是PHP且需要getshell的.所以,必备的PHP语法

CTF中图片隐藏文件分离方法总结

0x00 前言 在安全的大趋势下,信息安全越来越来受到国家和企业的重视,所以CTF比赛场次越来越多,而且比赛形式也不断的创新,题目也更加新颖有趣,对选手的综合信息安全能力有一个较好的考验,当然更好的是能从比赛有所收获,不断学习和总结提升自己的信息安全能力与技术.转到CTF比赛上,通常在CTF比赛中常有与隐写术(Steganography)相关的题目出现,这里我们讨论总结图片隐藏文件分离的方法,欢迎大家补充和交流:P 0x01 分析 这里我们以图片为载体,给了这样的一样图片: 首先我们需要对图片进

CTF中pwn exp编写的一些小技巧

因为是搞底层的,平时也不怎么写脚本,所以并不太熟悉python.之前介绍过zio库何pwntools了,这次就来介绍一下关于读取输入输出的编写方法. from struct import * struct对于我们这种跟二进制打交道的人来说是极其有用的. 如何接受输出的明文地址? 比如 output:0x802A308 可以这样来接收 io.read_until('output:') get=io.read(9) 字符串转成数字 addr=int(get,16) 如何接受输出的被当成ascii字符

ctf中常见注入题源码及脚本分析

1.代码审计发现 这里没有用escape_string,因此存在注入. 1 function show($username){ 2 global $conn; 3 $sql = "select role from `user` where username ='".$username."'"; 4 $res = $conn ->query($sql); 5 if($res->num_rows>0){ 6 echo "$username i

CTF中做Linux下漏洞利用的一些心得

其实不是很爱搞Linux,但是因为CTF必须要接触一些,漏洞利用方面也是因为CTF基本都是linux的pwn题目. 基本的题目分类,我认为就下面这三种,这也是常见的类型.