【知识点整理】bugku php语法相关
【记得复习!这是硬性的知识 你还忘得一干二净 别说以前的acm了。。。】
【复习就会发现,其实以前你根本没明白[跪] 由此即使花费了大量时间也值得 因为我们不是刷数目 做过讲不来 做过讲错 等于没做 按照周期 qaq 先复习 】
1. urldecode url编码 base64编码
2.sha1也是加密编码
3.file_get_contents() 把文件读入一个字符串。
4.md5加密有漏洞,sha1也是 无法处理字符串
md5可能会把0x开头的当成.... (见整理)
5.kekeyy
6.extract extract() 函数从数组中将变量导入到当前的符号表。
trim用于去掉边上的空格.....
7.file_get_contents($fn) 这个要求从文件里拿到值...
所以.. 这个常常使用php://input 然后post数据获得
8.perg_match用于正则表达柿的匹配!... [有关可参考模块博客]
(似乎只要匹配了就可以... fflagggg也可以返回_(:з」∠)_... 它很傻的,,一次就停止。。 )
9.base64解密的时候一但多了一点东西, 后面会变得很奇怪。。
尤其前面,我猜想应该是拆解序列的事情,后面就坏掉了,整个都坏掉了。。所以<br>这种东西要扔掉
10.序列化...
XFF头 127.0.0.1 但是那个是forwarded 先o再a 别拼错了....
11.explode()是把函数打散.....
参数: (在哪里分割,原串,元组数目)
是0: 一大个
是正: 返回有x个的 (a,b,c,d 如果是2 那就直接是[0]=>a [1]=>b,c,d)
是负: 把最后x个扔掉...
当然这个第三完全可以不写.....
12.(来自题目: 过狗一句话----指的是绕过安全狗,只要一句话就行了,就是assert执行任意函数。。)
?s=print_r(scandir('./'))
但是这个题还可以直接扫描目录。。。
目录:
.表示当前目录
.. 表示当前目录的上一级目录。
./表示当前目录下的某个文件或文件夹,视后面跟着的名字而定
../表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定。
例如:
文件夹 a
下面有 文件夹b c 和文件 d。
文件夹b下面有e.php 和文件f。
则e中的 . 表示 文件夹b
./f 表示b下面的文件f。
.. 表示a文件夹。
../d 表示a文件夹下的d文件
(在e中的 and e是php代码啊 php代表了什么 代表了这个.....)
扫描目录:
s=print_r(glob("*.*"))
s=print_r(scandir('./'))
..找到之后继续&&&&就好 了
adds:
还没解决的疑难杂症:==================
[welcome to bugku ctf]
理解一下代码:
you are not the number of bugku !
<!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}
-->
注意:(1)看这里的get方式我们应该传入txt=。。。 file=。。。 password=。。而不是user
(2)get应该直接地址栏,但是太长那个user(其实应该写成txt)可以用post和php://input来代替(这个用于处理没处理过的post数据)
所以我们应该写成(在index.php)后面写: ?txt=php://input& file=php://filter/read=convert.base64=encode/resource=hint.php&password=
(3)filter之前用过,不太懂但是很重要
然后这个网页像是死了一样... _(:з」∠)_搜了题解也没有用 ....
........发现hackbar的问题难怪界面长得不一样
然后发现自己的小错误!!!比如h少了一个点儿或者多一个空格甚至py里面多了空格都是不行的
少the啊多了个//啊:啊是很..很严重的错误!!!
它要求从文件中读入,我们要么找到一个正好包含它的文件,要么直接post(用input这个东西。。。)要么找到哪里有个备份的文件并且备份文件的内容正好是那一行
。。。。
【鸡贼地发现两个标签里都有代码。。。 比如来源是index.php 还可以来源是Hint.php Y因为给定了密码了...就..】
然后.. 使用index.php的base64编码, 发现!file可以不用include本地xxx了, 所以file=flag,拿到了 "不能闲着给你flag哦"
那么重点在我们拿到的:
<?php
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
?>
Ā
<?php
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){
echo "hello friend!<br>";
if(preg_match("/flag/",$file)){
echo "不能现在就给你flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}
?>
其实关键在序列化这里啊吧..... 就是如果文件包含flag, 不行的() 如果不包含flag, 就执行xxxx
那么如何跳过这里呢... 不能直接包含flag
我们所看到的提示就是在Flag类里面,__是一有这个类就自动调用,,去自动包含这个类里面的东西
而上面那里,如不含flag,就先读入文件,把password反序列化,输出password
以下copy
另外,我们可以知道我们要的flag就在flag.php中,所以我们就是要想办法调用__tostring()这个函数,让它包含flag.php文件。那就是要想办法引用Flag这个类。前面说到 unserialize() 如果被解序列化的变量是一个对象,那它的返回值就是一个对象,而且在我们这个代码中,还会echo这个对象,那echo的过程,就是引用这个对象的过程,我们就可以利用这个,来调用__tostring()函数。所以我们需要根据Flag类来给password传递一个合适的序列化变量。构造如下:
原文:https://blog.csdn.net/littlelittlebai/article/details/78816854?utm_source=copy
我们发现当Flag方法当做字符串执行时,会自动执行 __tostring 方法,方法中写了如果file文件存在,那么就输出file文件中的内容。
这不正是我们要解决的输出flag.php内容的情况吗???所以我们要构造一个Flag类型的参数,并把这个参数传给password然后get进去。并且这个file的值要是hint.php(因为要利用hint.php中的函数),即:————根据php序列化的结果
============================
也就是说,file里面不能包含flag,这样它就能跑到下面,进行这样的工作:
然后,文件在flag.php里,但是显然不能用file直接拿,可以用password间接找到。。如何找呢?file引用hint.php 那么就包含了hint.php的文件,可以调用hint.php里面的函数,而我们知道hint.php里有个"n你如果是Flag类, 我就给你我的__toStrong方法" 的函数,那么我们努力让password的值跟它扯上关系,让password去包含那个flag.php
================================
我们发现当Flag方法当做字符串执行时,会自动执行 __tostring 方法,方法中写了如果file文件存在,那么就输出file文件中的内容。(当做字符串输出的时候)
这不正是我们要解决的输出flag.php内容的情况吗???所以我们要构造一个Flag类型的参数,并把这个参数传给password然后get进去。并且这个file的值要是hint.php(因为要利用hint.php中的函数),即:————根据php序列化的结果
- <?php
- class Flag{
- public $file;
- }
- $a = new Flag();
- $a->file = "flag.php";
- $a = serialize($a);
- print_r($a);
- ?>
得到: O:4:"Flag":1:{s:4:"file";s:8:"flag.php";} 传入
(上面这个php代码怎么用???......) 找了下工具 一般只能反序列化 很少直接序列化(因为直接php就能跑了吧-.-)
(差不多就都是这样的)什么的.. 反正有点恐怖最好还是用php直接写吧qaq
就是让它反序列化了之后还有一个"flag.php"就好惹16661
[各种绕过]==========
我觉得只有我一个拿到了"flag{xxxxx}这种shabiflag"
不用在flag.php里面打 直接在外面web7/?xxx=....
[web8]
代码:<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>
要懂这是在干嘛鸭。。。
ac的值非空,fn的值从文件中获得。
文件中获得可以是input:// 也可以直接从txt什么什么的里面找..... ok
饿... 定义了f的值,f的值等于从文件里拿到的fn的值。……
......
!!!!!!最后发现hackbar的问题!!!!!他不能把input这样读进去成功!!!!!
这个东西于是要用postman!!!!! postman-REST-clinet
然后!! raw里面 (不要用前面两种) 然后拿到了!! .. (热泪盈眶)
[细心]
这真的是130分的题吗... 我第一次自己解出来..............
....................讨厌的大学物理网络规划设计路由交换操作系统作业计算机系统安全信息安全基础javaeejavaweb去死吧!!!!!......
.............就是御剑扫描了一下 ... 然后x=admin 多试验..
[求getshall]
它想要image, 不要php
但是实际上经过试验 , 我们发了jpg不会发生什么,根据这个意思应该还是得发php
那么发php 发了php 竹板这么以打压== 别的咱不话 。。……
直接发了php是不行的... 那么我们发个php, 然后在包里动用特权改成jpg......
下面就开始玄学了, 交上去的还是php,只不过改成了php5, 然后改了头部content-type的值(估计就是在原来代码里没有这个-... 然后还只有php5可用.... 我怎么觉得这里肯定又代码控制呢).... 然后事实就是我找不到-.-
getshell是取得权限的意思
==============其他补课:
一、
file_get_contents() 函数把整个文件读入一个字符串中。
和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。
语法
file_get_contents(path,include_path,context,start,max_length)
参数 | 描述 |
---|---|
path | 必需。规定要读取的文件。 |
include_path | 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。 |
context |
可选。规定文件句柄的环境。 context 是一套可以修改流的行为的选项。若使用 null,则忽略。 |
start | 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。 |
max_length |
可选。规定读取的字节数。该参数是 PHP 5.1 新加的。 |
... 注意是要找到文件 在xxx地方找到文件才包含进来 , 你有路径么.... ..........没有还搞毛啊
echo file_get_contents("test.txt");
这样就直接把txt的东西搞出来了...
二、
php的serialize()函数和unserialize()函数
适用情境:serialize()返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。这有利于存储或传递 PHP 的值,同时不丢失其类型和结构。比较有用的地方就是将数据存入数据库或记录在文件中的时候