皮皮网

皮皮网

【App滤镜源码】【源码搭建工具】【jenkins 插件远源码】sqlmap源码查询

时间:2024-12-29 18:44:56 分类:综合

1.c#读取Config文件的源码问题
2.2023最新版超详细Sqlmap安装保姆级教程,SQL注入使用指南,查询收藏这一篇就够了
3.第79篇:记一次Oracle注入漏洞提权的源码艰难过程
4.某商城最新CMS从0day审计到漏洞利用
5.米桃安全漏洞讲堂系列第1期:SQL注入漏洞
6.6款较流行的开源漏洞扫描工具推荐及特点分析

sqlmap源码查询

c#读取Config文件的问题

       应用程序配置文件(App.config)是标准的 XML 文件,XML 标记和属性是查询区分大小写的。它是源码可以按需要更改的,开发人员可以使用配置文件来更改设置,查询App滤镜源码而不必重编译应用程序。源码

       对于一个config文件:

       <?查询xml version="1.0" encoding="utf-8" ?>

       <configuration>

        <appSettings>

        <add key="ServerIP" value=".0.0.1"></add>

        <add key="DataBase" value="WarehouseDB"></add>

        <add key="user" value="sa"></add>

        <add key="password" value="sa"></add>

        </appSettings>

       </configuration>

       对config配置文件的读写类:

       using System;

       using System.Collections.Generic;

       using System.Linq;

       using System.Text;

       using System.Text.RegularExpressions;

       using System.Configuration;

       using System.ServiceModel;

       using System.ServiceModel.Configuration;

       namespace NetUtilityLib

       {

        public static class ConfigHelper

        {

        //依据连接串名字connectionName返回数据连接字符串

        public static string GetConnectionStringsConfig(string connectionName)

        {

        //指定config文件读取

        string file = System.Windows.Forms.Application.ExecutablePath;

        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(file);

        string connectionString =

        config.ConnectionStrings.ConnectionStrings[connectionName].ConnectionString.ToString();

        return connectionString;

        }

        ///<summary>

        ///更新连接字符串

        ///</summary>

        ///<param name="newName">连接字符串名称</param>

        ///<param name="newConString">连接字符串内容</param>

        ///<param name="newProviderName">数据提供程序名称</param>

        public static void UpdateConnectionStringsConfig(string newName, string newConString, string newProviderName)

        {

        //指定config文件读取

        string file = System.Windows.Forms.Application.ExecutablePath;

        Configuration config = ConfigurationManager.OpenExeConfiguration(file);

        bool exist = false; //记录该连接串是否已经存在

        //如果要更改的连接串已经存在

        if (config.ConnectionStrings.ConnectionStrings[newName] != null)

        {

        exist = true;

        }

        // 如果连接串已存在,首先删除它

        if (exist)

        {

        config.ConnectionStrings.ConnectionStrings.Remove(newName);

        }

        //新建一个连接字符串实例

        ConnectionStringSettings mySettings =

        new ConnectionStringSettings(newName,源码 newConString, newProviderName);

        // 将新的连接串添加到配置文件中.

        config.ConnectionStrings.ConnectionStrings.Add(mySettings);

        // 保存对配置文件所作的更改

        config.Save(ConfigurationSaveMode.Modified);

        // 强制重新载入配置文件的ConnectionStrings配置节

        ConfigurationManager.RefreshSection("ConnectionStrings");

        }

        ///<summary>

        ///返回*.exe.config文件中appSettings配置节的value项

        ///</summary>

        ///<param name="strKey"></param>

        ///<returns></returns>

        public static string GetAppConfig(string strKey)

        {

        string file = System.Windows.Forms.Application.ExecutablePath;

        Configuration config = ConfigurationManager.OpenExeConfiguration(file);

        foreach (string key in config.AppSettings.Settings.AllKeys)

        {

        if (key == strKey)

        {

        return config.AppSettings.Settings[strKey].Value.ToString();

        }

        }

        return null;

        }

        ///<summary>

        ///在*.exe.config文件中appSettings配置节增加一对键值对

        ///</summary>

        ///<param name="newKey"></param>

        ///<param name="newValue"></param>

        public static void UpdateAppConfig(string newKey, string newValue)

        {

        string file = System.Windows.Forms.Application.ExecutablePath;

        Configuration config = ConfigurationManager.OpenExeConfiguration(file);

        bool exist = false;

        foreach (string key in config.AppSettings.Settings.AllKeys)

        {

        if (key == newKey)

        {

        exist = true;

        }

        }

        if (exist)

        {

        config.AppSettings.Settings.Remove(newKey);

        }

        config.AppSettings.Settings.Add(newKey, newValue);

        config.Save(ConfigurationSaveMode.Modified);

        ConfigurationManager.RefreshSection("appSettings");

        }

        // 修改system.serviceModel下所有服务终结点的IP地址

        public static void UpdateServiceModelConfig(string configPath, string serverIP)

        {

        Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);

        ConfigurationSectionGroup sec = config.SectionGroups["system.serviceModel"];

        ServiceModelSectionGroup serviceModelSectionGroup = sec as ServiceModelSectionGroup;

        ClientSection clientSection = serviceModelSectionGroup.Client;

        foreach (ChannelEndpointElement item in clientSection.Endpoints)

        {

        string pattern = @"\b\d{ 1,3}\.\d{ 1,3}\.\d{ 1,3}\.\d{ 1,3}\b";

        string address = item.Address.ToString();

        string replacement = string.Format("{ 0}", serverIP);

        address = Regex.Replace(address, pattern, replacement);

        item.Address = new Uri(address);

        }

        config.Save(ConfigurationSaveMode.Modified);

        ConfigurationManager.RefreshSection("system.serviceModel");

        }

        // 修改applicationSettings中App.Properties.Settings中服务的IP地址

        public static void UpdateConfig(string configPath, string serverIP)

        {

        Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);

        ConfigurationSectionGroup sec = config.SectionGroups["applicationSettings"];

        ConfigurationSection configSection = sec.Sections["DataService.Properties.Settings"];

        ClientSettingsSection clientSettingsSection = configSection as ClientSettingsSection;

        if (clientSettingsSection != null)

        {

        SettingElement element1 = clientSettingsSection.Settings.Get("DataService_SystemManagerWS_SystemManagerWS");

        if (element1 != null)

        {

        clientSettingsSection.Settings.Remove(element1);

        string oldValue = element1.Value.ValueXml.InnerXml;

        element1.Value.ValueXml.InnerXml = GetNewIP(oldValue, serverIP);

        clientSettingsSection.Settings.Add(element1);

        }

        SettingElement element2 = clientSettingsSection.Settings.Get("DataService_EquipManagerWS_EquipManagerWS");

        if (element2 != null)

        {

        clientSettingsSection.Settings.Remove(element2);

        string oldValue = element2.Value.ValueXml.InnerXml;

        element2.Value.ValueXml.InnerXml = GetNewIP(oldValue, serverIP);

        clientSettingsSection.Settings.Add(element2);

        }

        }

        config.Save(ConfigurationSaveMode.Modified);

        ConfigurationManager.RefreshSection("applicationSettings");

        }

        private static string GetNewIP(string oldValue, string serverIP)

        {

        string pattern = @"\b\d{ 1,3}\.\d{ 1,3}\.\d{ 1,3}\.\d{ 1,3}\b";

        string replacement = string.Format("{ 0}", serverIP);

        string newvalue = Regex.Replace(oldValue, pattern, replacement);

        return newvalue;

        }

        }

       }

       测试代码如下:

        class Program

        {

        static void Main(string[] args)

        {

        try

        {

        //string file = System.Windows.Forms.Application.ExecutablePath + ".config";

        //string file1 = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

        string serverIP = ConfigHelper.GetAppConfig("ServerIP");

        string db = ConfigHelper.GetAppConfig("DataBase");

        string user = ConfigHelper.GetAppConfig("user");

        string password = ConfigHelper.GetAppConfig("password");

        Console.WriteLine(serverIP);

        Console.WriteLine(db);

        Console.WriteLine(user);

        Console.WriteLine(password);

        ConfigHelper.UpdateAppConfig("ServerIP", "..1.");

        string newIP = ConfigHelper.GetAppConfig("ServerIP");

        Console.WriteLine(newIP);

        Console.ReadKey();

        }

        catch (Exception ex)

        {

        Console.WriteLine(ex.Message);

        }

        }

        }

最新版超详细Sqlmap安装保姆级教程,SQL注入使用指南,查询收藏这一篇就够了

       sqlmap 是源码一个用于 SQL 注入的自动化工具,支持多种数据库,查询如 MySQL、源码Oracle、查询Access 等。源码它具备多种独特功能,例如数据库指纹识别、枚举、数据提取、访问目标文件系统,甚至在获取完全权限时执行任意命令。sqlmap 跨平台且易于使用,是 SQL 注入领域的强大工具。

       安装 sqlmap 需要先安装 git:

       apt-get install git

       然后克隆 sqlmap 代码库:

       git clone git://github.com/sqlmapproject/sqlmap.git

       测试 sqlmap 是否正常工作,前提需要安装 Python 2:

       apt install python2

       cd 到 sqlmap 目录:

       cd sqlmap/

       运行 sqlmap 命令并查看帮助手册:

       ./sqlmap.py -h

       检测 SQL 注入:

       1. 手动判断是否存在漏洞。对动态网页进行安全审计,通过接受动态用户提供的 GET、POST、Cookie 参数值、User-Agent 请求头。构造 url1 和 url2,如果 url1 访问结果与原始网页一致,url2 不一致,表示存在 SQL 注入。

       2. 使用 sqlmap 自动检测漏洞。检测语法为:sqlmap.py -u 目标 url。

       3. 寻找 SQL 注入实例,通过百度搜索特定字符串并测试 URL。

       进行数据库操作:

       列数据库信息:--dbs

       获取当前使用的数据库:--current-db

       获取当前用户:--current-user

       列出 SQL Server 所有用户:--users

       列出数据库账户与密码:--passwords

       指定数据库列出所有表:-D 数据库名 --tables

       指定数据库表列出所有字段:-D 数据库名 -T 表名 --columns

       导出指定字段的数据:-D 数据库名 -T 表名 -C 字段名 --dump

       指定范围导出数据:-D 数据库名 -T 表名 -C 字段名 --start 行数 --stop 行数 --dump

       SQLMAP 实用技巧:

       绕过 WAF 注入:修改 sqlmap 源代码文件,使用特定的绕过方法。

       URL 重写测试:使用特殊字符进行注入测试。

       列举并破解密码哈希:sqlmap 列举用户并尝试破解密码。

       获取数据个数:使用 --count 参数。

       网站漏洞爬取:使用 --batch --crawl 参数。

       预估时间注入:使用 --eta 参数。

       使用 hex 避免编码问题:使用 --hex 参数。

       模拟手机环境:使用 --mobile 参数。

       智能判断测试:使用 --batch --smart 参数。

       结合 burpsuite 使用:使用 -r 参数读取抓包文件。

       自动填写表单注入:自动化表单填写功能。

       读取文件:使用 --file 参数读取特定文件。

       延时注入:使用 --technique 参数。

       结合 burpsuite 进行 post 注入:通过配置 burpsuite 代理拦截请求。

       cookies 注入:通过 --cookies 参数进行 cookies 注入。

       MySQL 提权:连接数据库后,利用 sqlmap 上传特定插件。源码搭建工具

       执行命令:特定权限下可执行命令。

       通过以上步骤和技巧,可以全面掌握 sqlmap 的使用方法,有效进行 SQL 注入测试和数据库操作。

第篇:记一次Oracle注入漏洞提权的艰难过程

       大家好,我是ABC_。我近期遇到了一个Oracle注入漏洞,是搜索型的盲注漏洞,只能通过折半法一个字符一个字符的猜解数据。经过判断,发现这是DBA权限的注入点。接下来,我将分享如何通过这个注入点获取操作系统的权限,并且分享了在技术研究过程中遇到的问题和解决方法。

       在解决这个问题时,我进行了两方面的优化来加快SQL注入的速度。首先,我在search=%语句中加入了存在结果很少的搜索值,比如将search=%,只显示出一条搜索结果,这样可以减少数据库的检索量和HTTP返回的数据包大小,从而加快SQL注入的速度。其次,我修改了SQLmap的默认个线程限制,这需要修改SQLmap的源码,这里就不详细解释了。

       在Oracle注入提权的语句方面,我注意到很多文章给出的语句通常分为三个步骤,其中第二步就是赋予当前Oracle账号相关的JAVA权限。然而,这个语句包含了大量的单引号和左右尖括号,有时候会被转义掉导致注入失败,而且这个语句异常复杂,容易出错。因此,我使用了一个简单的语句替代,效果更佳。这个语句的格式是BEGIN开头,然后end;结尾,代表一个PL/SQL语句块,如下所示:select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''grant javasyspriv to test''; end;') from dual。

       我使用了SQLmap的--sql-shell命令将上述语句执行,但是最后执行的命令没有成功。在处理这种情况时,我通常有两种可能:一是执行命令被拦截,二是Java代码没有执行成功。因此,我使用了如下SQL语句进行判断,结果返回0,说明函数没有添加成功。经过一系列测试,我发现是SQLmap的SQL-shell下功能下,上述复杂的SQL语句根本没执行成功。

       为了更方便地执行Oracle的复杂SQL语句,我将SQL注入语句进行了修改,jenkins 插件远源码通过and (插入SQL语句) is not null的方式,可以在左右括号中插入各种Oracle的SQL语句。然而,这种方法也遇到了WAF拦截的问题。为了解决这个问题,我使用了Oracle特有的编码方式,将SQL语句成功执行。再次执行查询LinuxUtil是否存在的SQL语句,发现返回count()不为0,说明Java代码成功添加执行。然而,LinuxUtil命令依然无法执行,我怀疑是Java权限没有添加成功。我执行了查询当前用户权限的语句,发现当前用户具有CONNECT、RESOURCE、JAVASYSPRIV权限,说明Java相关权限确实是添加成功了。然而,为什么还是无法调用LinuxUtil命令呢?我重新搭建了测试环境,使用Navicat执行Oracle提权语句后,发现报了权限错误。

       在查阅大量国外文章后,我发现判断当前用户是否有Java权限,需要查询session_roles表。该表用于显示当前会话中的角色信息,必须session_roles中有JAVASYSPRIV权限才行。我尝试断开Oracle当前账号的连接,重新连接之后,session_roles表中就有相应权限了。然而,我们是在SQL注入点,无法断开重连,那么如何使Java权限立即生效呢?国外文章给出了几种方法,但执行后仍然无法解决问题。

       在等待第二天后,惊奇地发现session_roles中存在JAVASYSPRIV角色了,我也不清楚原因,但此时可以通过select LinuxExecHanshu('whoami') from dual执行命令。然而,盲注过程太麻烦,我选择结合SQLmap的SQL-shell终端来盲注入,因为该SQL语句比较简短,SQLmap的SQL-shell模式猜解是完全无压力的。最终,我们成功获取了系统权限。

       总结来说,这个dbms_xmlquery.newcontext函数在高版本的Oracle数据库中已经不能提权成功,甚至不能使用,需要使用其他方法进行提权。在本地搭建的Oracle环境中,大多数情况下可以直接提权成功,但极少数情况下需要断开重连,具体原因不明。如果文章中有错误,.net url重写源码欢迎批评指正。后续,我将继续分享Oracle提权的其他方法,敬请期待。

某商城最新CMS从0day审计到漏洞利用

       吃个早餐,开始了新的一天。朋友分享了最新的商城CMS给我,我决定帮忙审计,并分享这次经历。

       首先,我部署了网站源码并查看了前台和后台页面。接着,使用工具进行了初步审计。我了解到,尽管多入口CMS有时工具难以发现漏洞,工具仍能提供半辅助作用。

       我分析了item.php中拼接参数的部分,使用Sublime Text3打开进行研究。在SQL语句中,发现id值直接拼接,随后分析了Req()、Qry()、Qra()函数,发现它们没有过滤。

       我进一步查看require引入的common.php文件,发现Qry和Qrc函数为正常数据库操作,而Req函数只是一种接受参数的方式。但函数内有Rpl函数,它进行了字符串替换,替换了加号、空格等字符。

       在SQL语句中,$n通过"."进行拼接,无需单引号或双引号闭合。我构造了payload进行注入尝试,发现可以成功绕过Rpl函数。

       为了验证,我使用了SQLMAP工具并找到了一个空格替换为/**/的tamper。通过运行sqlmap构造参数,我成功找到了数据库test2中的xxx_admin表及其字段Nm和Np的内容。

       最后,我总结了这次审计的经验,强调了使用过滤方法,如PDO预编译,来修复漏洞的重要性。文章源于微信公众号(米瑞尔信息安全),由作者啊giao撰写。

米桃安全漏洞讲堂系列第1期:SQL注入漏洞

       米桃安全漏洞讲堂系列第1期:深入解析SQL注入漏洞

       SQL注入漏洞是一种攻击手段,攻击者通过在用户输入数据中插入恶意SQL语句,误导服务器执行非预期命令,可能导致数据泄露、系统破坏甚至权限获取。其核心在于输入验证不足,导致数据直接拼接到SQL语句中执行。例如,qt 公开源码如果用户输入"password’ OR 1=1",可能导致所有用户信息暴露。

       漏洞类型严重,后果多样:数据被窃取,如关键业务数据和用户认证信息泄漏;数据库被篡改,影响系统正常运行和业务流程;甚至黑客可能获取数据库管理员权限,操控服务器。因此,SQL注入通常被视为高危漏洞。

       SQL注入漏洞的常见位置是任何客户端可控的变量,特别是那些参与数据库查询的输入。防止这类漏洞的方法包括:参数化查询,验证用户输入,使用安全的框架调用数据库,以及限制用户数据库操作权限。

       测试SQL注入漏洞通常分为发现注入点、信息搜集、数据获取和提权四个阶段,手工注入和自动化工具如Sqlmap都可应用于检测。防范措施包括使用自动化工具进行更高效的扫描,以及实施企业安全防护策略,如安全开发培训、源码扫描、Web应用防火墙、SRC平台和动态应用安全扫描等。

       总结来说,对SQL注入的理解和防御不仅是技术层面的问题,也涉及全面的安全策略和持续的安全管理。防止SQL注入不仅要在设计阶段做好防护,上线后还要结合各种安全工具和平台,共同构建多层次的防护体系。

6款较流行的开源漏洞扫描工具推荐及特点分析

       漏洞扫描是网络安全的重要一环,未修复的漏洞是网络犯罪分子的攻击目标。企业数据安全事件往往源于已知漏洞,尽管有补丁,仍可能无法及时发现和修复。开源漏洞扫描工具因其开放源代码特性、社区支持和更新频度,在组织中广泛应用。本文推荐并分析了6款流行的开源漏洞扫描工具。

       1. **Nmap**:一款自动化安全测试工具,适用于各种操作系统,快速扫描大型网络,检测开放端口、服务、操作系统版本等信息。功能全面,易于上手,且拥有庞大的用户群。

       主要特点:快速端口查询、基于协议的扫描、广泛的功能和工具、持续增长的检测脚本库、兼容所有开放端口的设备。

       不足:无正式客户支持,需一定经验或编程能力。

       2. **OpenVAS**:提供全面渗透测试能力,支持未经身份验证的测试、目标扫描和Web漏洞扫描,源自Nessus,现为Tenable的商业化产品。更新频繁,免费版本功能全面。

       主要特点:每日更新威胁信息源、功能全面、多系统扫描、主流社区支持、上下文信息丰富。

       不足:专业门槛高、多任务扫描可能崩溃、高级功能需付费。

       3. **ZAP**:Zed Attack Proxy(ZAP)为渗透测试提供了友好的界面和自动化扫描器,同时也支持手动查找漏洞。具备DAST能力,可模拟用户行为进行漏洞测试。

       主要特点:自动化扫描、手动工具、API和Docker集成、Crash Override奖学金支持、广泛使用。

       不足:部分功能需插件、专业知识要求、误报率较高。

       4. **OSV-Scanner**:由谷歌开发的开源工具,用于静态软件组成分析,检测编程代码安全漏洞,支持多种编程语言,获取大量漏洞信息,支持API和GitHub集成。

       主要特点:支持多种编程语言、大量信息源、API和GitHub集成、JSON存储。

       不足:仅检查开源库漏洞、新工具,未纳入主流认证。

       5. **CloudSploit**:Aqua公司维护的开源云基础设施扫描工具,持续监控云环境,发送实时警报,检查云和容器部署漏洞及常见配置错误。

       主要特点:扫描多云环境、实时警报、API调用、广泛云支持。

       不足:某些功能需付费、需与其他安全工具结合、专注于公有云。

       6. **sqlmap**:专注于数据库漏洞扫描的工具,自动化SQL注入测试,支持多种数据库服务器,具备强大测试引擎,识别多种注入攻击。

       主要特点:DBMS连接测试、命令行操作、多种SQL注入类型支持、密码哈希和破解功能、多种数据库管理系统支持。

       不足:命令行操作、仅针对数据库漏洞、需数据库专业知识。

拿站的步骤分几步

       下面我就把我拿站的步骤给说一下。

        第一:找后台。利用所知道的所有知识找后台。工具,猜目录。等等 (工具:啊D 明小子 萝卜 清凉的目录扫描软件 )

        第二:后台找到了那么就社工下,看看能不能利用弱口令或者万能进去。进去就好说了直接拿SHELL。但是若口令不行只有其他办法了。

        第三:找SQL注射点。GOOGLE语法 sqlmap 手工 WVS 等等,都可以帮大家找 。

        第四:没有注射,旁注。 明小子就有这个功能。还有就是www.bing.com 这个网站,ip.wen.la

        都是找旁注不错的方法。

        第五:没旁注 ,那就得看服务器了 ,开启了什么端口。比如 什么的。这些端口大家懂的。FTP是有办法爆破的。

        第六:敏感端口没有开启。那就返回来继续观察网站。看下网站的设计。有什么网站是和这个网站是一样的。可以拿下那个网站下载下源码查看下有什么漏洞。

        总结:据我所知一般的网站都是有XSS漏洞的。虽然没多少权限,但是多数前台权限还是有的。

        最后说下要学习渗透的步骤。这个只是我自己的想法。

        各种工具利用----了解各种数据库(access mysql mssql )-----手工学习(更容易了解网站原理)----做笔记(把自己拿站的笔记记下,拿复杂的站会有用的。)暂时就说这么多了。

域渗透之外网打点到三层内网

       本次项目模拟渗透测试人员在授权的情况下,对目标进行渗透测试,从外网打点到内网横向渗透,最终获取整个内网权限。项目属于三层代理内网穿透,涵盖内网穿透技术、工具利用、手写exp、外网打点方法、流行内网渗透测试办法等,对个人提升很有帮助。

       在VPS映射部分,首先将内网IP映射到公网,使用frp工具实现。在公网VPS上运行frps.exe -c frps.ini,web1上运行frpc.ini,成功访问到环境。

       信息收集方面,端口探测显示、、、、端口开放,网站源代码查找后发现网上银行系统,通过弱口令和暴力破解未能爆破出用户,但在GitHub上找到源码,发现数据库文件包含普通和管理员账户信息。

       SQL注入测试发现存在Hsql注入漏洞,使用sqlmap无法获取用户名和密码,于是编写脚本成功跑出密码并登录。在另一个地址的tomexam系统中,注册用户后发现存在SQL注入,使用sqlmap获取用户信息,通过解密脚本成功登录管理员后台。

       针对jspxcms-SQL注入,首页允许注册和登录,搜索历史漏洞后发现可以通过文件上传实现getshell,使用sqlmap查找表、用户和密码。登录后编写目录穿越脚本成功上传,获取webshell并使用哥斯拉连接。

       内网渗透中,首先配置内网cobalt strike上线,使用frp反向代理实现。使用shell iponfig收集信息,测试与其他域内主机的连通性,查看计算机名,发现无法找到域内其他主机。查看server的IP地址,发现存在Mysql端口,尝试暴力破解后成功获取账号和密码,使用mysql用户登录Mssql服务器,通过xp_cmshell进行信息收集,使用certutil远程下载木马实现上线。

       在域渗透阶段,使用net view查看域内主机,使用hashdump抓取用户hash值,获取域控IP地址和计算机名。编译并测试zerolgin脚本,将其设置为空密码。配置kali代理,获取域控hash值并登录,关闭防火墙使用pth上线cs,生成tcp监听后jump到域控主机,成功恢复密码并获取hash值。

       项目涉及环境搭建、信息收集、工具利用、手写exp、外网打点、内网穿透、内网渗透、域渗透等全面技术,是一次从外网到内网、再到域控的完整渗透测试演练。尽管靶机未安装杀软,但此过程展示了从外网到内网、再到域控的广泛知识和技能。

SQLMap 源码阅读

       本文主要解析了SQLMap的源码阅读流程。首先,我们确认了SQLMap运行的流程图,这有助于我们深入理解源码。在开始SQLMap运行前,程序进行一系列初始化操作,包括环境设置、依赖加载、变量配置等。

       接下来,我们处理URL。通过cmdLineParser()从命令行获取参数,进而通过initOptions(cmdLineOptions)解析这些命令行参数。初始化函数中,通过loadBoundaries()、loadPayloads()、_loadQueries()加载payload,这些函数负责从XML文件中加载边界、payload和查询。在loadBoundaries()中,程序读取data/xml/boundaries.xml文件并解析其中的XML,将结果添加到conf对象的tests属性中。conf对象存储了目标的相关信息以及配置信息。

       在URL处理阶段,程序通过getCurrentThreadData()获取当前线程数据,并调用f(*args, **kwargs)进行处理。这里的逻辑位于/lib/controller/controller.py文件下,主要工作包括打印日志、赋值和添加HTTP Header等,最终到达parseTargetUrl()函数。在该函数中,程序进行URL的剖析与拆解,并将这些内容保存到conf对象的对应属性中,以便后续使用。

       接着,SQLMap会生成注入检测的payload,核心代码位于controller.py文件的行。在setupTargetEnv()函数中,程序调用hashDBRetrieve()函数,根据参数KB_INJECTIONS检索payload。payload生成逻辑在第行,执行SQL语句并使用basePickle进行加密。最终,程序生成payload并进行探测,如果目标返回Connection refused,则返回False。

       在WAF检测部分,当URL处理完毕后,程序进行探测,判断目标是否存在WAF。如果存在WAF,则生成用于fuzz的payload,这个payload基于http-waf-detect.nse文件。在经过一系列的数据处理和判断后,程序检测WAF类型,包括正则匹配和页面相似度分析。

       对于注入检测,SQLMap提供了启发式注入和正式注入两种方式。在启发式注入阶段,程序通过随机字符构造Payload来识别数据库版本、获取绝对路径和进行XSS测试。在正式注入阶段,程序根据数据库信息构建索引,选择最有效的payload进行攻击。在处理payload时,程序会进行清洗、组合和请求,直到注入成功。

       爆数据库等操作在正式注入成功后进行。程序首先根据后台数据库信息输出日志,然后执行getDbs()函数获取数据库名。在getDbs()中,程序通过查询语句计算数据库个数并依次获取数据库名。之后,程序在errorUse()函数中解析payload并提取schema_name,进而执行探测数据库个数的SQL语句。最后,程序多线程方式注入并提取结果,完成数据库的爆破。

       整个SQLMap的流程分析中,理解初始化、URL处理、注入检测和爆数据库等关键步骤是至关重要的。同时,审计前查看utils文件夹下的Python文件,可以帮助我们更好地理解流程,尽管在正则表达式处理时可能会遇到挑战。