偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

無字母數(shù)字Webshell之提高篇

安全 應(yīng)用安全
難點呼之欲出了,我前面文章中給出的所有方法,都用到了PHP中的變量,需要對變量進行變形、異或、取反等操作,最后動態(tài)執(zhí)行函數(shù)。但現(xiàn)在,因為$不能使用了,所以我們無法構(gòu)造PHP中的變量。

前幾天有同學提出了一個問題,大概代碼如下:

  1. <?php 
  2. if(isset($_GET['code'])){ 
  3.     $code = $_GET['code']; 
  4.     if(strlen($code)>35){ 
  5.         die("Long."); 
  6.     } 
  7.     if(preg_match("/[A-Za-z0-9_$]+/",$code)){ 
  8.         die("NO."); 
  9.     } 
  10.     eval($code); 
  11. }else{ 
  12.     highlight_file(__FILE__); 

這個代碼如果要getshell,怎樣利用?

這題可能來自是我曾寫過的一篇文章,里面介紹了如何構(gòu)造無字母數(shù)字的webshell。其中有兩個主要的思路:

  • 利用位運算
  • 利用自增運算符

當然,這道題多了兩個限制:

  • webshell長度不超過35位
  • 除了不包含字母數(shù)字,還不能包含$和_

難點呼之欲出了,我前面文章中給出的所有方法,都用到了PHP中的變量,需要對變量進行變形、異或、取反等操作,最后動態(tài)執(zhí)行函數(shù)。但現(xiàn)在,因為$不能使用了,所以我們無法構(gòu)造PHP中的變量。

所以,如何解決這個問題?

PHP7 下簡單解決問題

我們將上述代碼放在index.php中,然后執(zhí)行docker run –rm -p 9090:80 -v pwd:/var/www/html php:7.2-apache,啟動一個php 7.2的服務(wù)器。

php7中修改了表達式執(zhí)行的順序:http://php.net/manual/zh/migration70.incompatible.php

PHP7前是不允許用($a)();這樣的方法來執(zhí)行動態(tài)函數(shù)的,但PHP7中增加了對此的支持。所以,我們可以通過(‘phpinfo’)();來執(zhí)行函數(shù),第一個括號中可以是任意PHP表達式。

所以很簡單了,構(gòu)造一個可以生成phpinfo這個字符串的PHP表達式即可。payload如下(不可見字符用url編碼表示):

  1. (~%8F%97%8F%96%91%99%90)(); 

 

PHP5的思考

我們使用docker run –rm -p 9090:80 -v pwd:/var/www/html php:5.6-apach來運行一個php5.6的web環(huán)境。

此時,我們嘗試用PHP7的payload,將會得到一個錯誤:

原因就是php5并不支持這種表達方式。

在我在知識星球里發(fā)出帖子的時候,其實還沒想到如何用PHP5解決問題,但我有自信解決它,所以先發(fā)了這個小挑戰(zhàn)。后來關(guān)上電腦仔細想想,發(fā)現(xiàn)當思路禁錮在一個點的時候,你將會鉆進牛角尖;當你用大局觀來看待問題,問題就迎刃而解。

當然,我覺得我的方法應(yīng)該不是唯一的,不過一直沒人出來公布答案,我就先拋鉆引玉了。

大部分語言都不會是單純的邏輯語言,一門全功能的語言必然需要和操作系統(tǒng)進行交互。操作系統(tǒng)里包含的最重要的兩個功能就是“shell(系統(tǒng)命令)”和“文件系統(tǒng)”,很多木馬與遠控其實也只實現(xiàn)了這兩個功能。

PHP自然也能夠和操作系統(tǒng)進行交互,“反引號”就是PHP中最簡單的執(zhí)行shell的方法。那么,在使用PHP無法解決問題的情況下,為何不考慮用“反引號”+“shell”的方式來getshell呢?

PHP5+shell打破禁錮

因為反引號不屬于“字母”、“數(shù)字”,所以我們可以執(zhí)行系統(tǒng)命令,但問題來了:如何利用無字母、數(shù)字、$的系統(tǒng)命令來getshell?

好像問題又回到了原點:無字母、數(shù)字、$,在shell中仍然是一個難題。

此時我想到了兩個有趣的Linux shell知識點:

  • shell下可以利用.來執(zhí)行任意腳本
  • Linux文件名支持用glob通配符代替

第一點曾在在我之前的文章露出過一角,但我沒細講。.或者叫period,它的作用和source一樣,就是用當前的shell執(zhí)行一個文件中的命令。比如,當前運行的shell是bash,則. file的意思就是用bash執(zhí)行file文件中的命令。

用. file執(zhí)行文件,是不需要file有x權(quán)限的。那么,如果目標服務(wù)器上有一個我們可控的文件,那不就可以利用.來執(zhí)行它了嗎?

這個文件也很好得到,我們可以發(fā)送一個上傳文件的POST包,此時PHP會將我們上傳的文件保存在臨時文件夾下,默認的文件名是/tmp/phpXXXXXX,文件名最后6個字符是隨機的大小寫字母。

第二個難題接踵而至,執(zhí)行. /tmp/phpXXXXXX,也是有字母的。此時就可以用到Linux下的glob通配符:

  • *可以代替0個及以上任意字符
  • ?可以代表1個任意字符

那么,/tmp/phpXXXXXX就可以表示為/*/?????????或/???/?????????。

但我們嘗試執(zhí)行. /???/?????????,卻得到如下錯誤:

這是因為,能夠匹配上/???/?????????這個通配符的文件有很多,我們可以列出來:

可見,我們要執(zhí)行的/tmp/phpcjggLC排在倒數(shù)第二位。然而,在執(zhí)行第一個匹配上的文件(即/bin/run-parts)的時候就已經(jīng)出現(xiàn)了錯誤,導致整個流程停止,根本不會執(zhí)行到我們上傳的文件。

思路又陷入了僵局,雖然方向沒錯。

深入理解glob通配符

大部分同學對于通配符,可能知道的都只有*和?。但實際上,閱讀Linux的文檔( http://man7.org/linux/man-pages/man7/glob.7.html ),可以學到更多有趣的知識點。

其中,glob支持用[^x]的方法來構(gòu)造“這個位置不是字符x”。那么,我們用這個姿勢干掉/bin/run-parts:

排除了第4個字符是-的文件,同樣我們可以排除包含.的文件:

現(xiàn)在就剩最后三個文件了。但我們要執(zhí)行的文件仍然排在最后,但我發(fā)現(xiàn)這三個文件名中都不包含特殊字符,那么這個方法似乎行不通了。

繼續(xù)閱讀glob的幫助,我發(fā)現(xiàn)另一個有趣的用法:

就跟正則表達式類似,glob支持利用[0-9]來表示一個范圍。

我們再來看看之前列出可能干擾我們的文件:

所有文件名都是小寫,只有PHP生成的臨時文件包含大寫字母。那么答案就呼之欲出了,我們只要找到一個可以表示“大寫字母”的glob通配符,就能精準找到我們要執(zhí)行的文件。

翻開ascii碼表,可見大寫字母位于@與[之間:

那么,我們可以利用[@-[]來表示大寫字母:

顯然這一招是管用的。

構(gòu)造POC,執(zhí)行任意命令

當然,php生成臨時文件名是隨機的,最后一個字符不一定是大寫字母,不過多嘗試幾次也就行了。

最后,我傳入的code為?>,發(fā)送數(shù)據(jù)包如下:

成功執(zhí)行任意命令。

責任編輯:趙寧寧 來源: FreeBuf
相關(guān)推薦

2020-03-18 15:54:41

開發(fā)效率代碼

2013-04-19 10:56:54

2018-04-03 13:10:27

Java對象克隆

2012-11-05 10:43:38

軟件質(zhì)量軟件開發(fā)Facebook

2012-11-06 13:24:51

Amazon軟件質(zhì)量軟件開發(fā)

2012-06-08 10:12:56

軟件質(zhì)量Google

2020-08-02 08:02:26

Webshell樣本安全

2011-05-19 14:11:29

Oracle

2021-12-07 08:50:40

字母區(qū)間字符串

2012-11-07 09:48:26

2014-12-16 10:28:49

2023-01-11 21:02:00

數(shù)字人民幣

2013-06-03 15:15:51

2024-01-16 16:47:24

數(shù)字孿生建筑信息模型

2024-04-01 14:24:05

數(shù)字信任人工智能

2009-07-31 14:50:16

電纜回波損耗

2011-02-25 10:25:07

Proftpd

2011-02-25 10:36:12

Proftpd

2020-09-29 06:43:12

Java

2023-09-08 09:38:59

點贊
收藏

51CTO技術(shù)棧公眾號