1 背景
面经总结第三篇–OWASP TOP10。
下面的部分内容可能引用自其他师傅的文章,有的忘记引用了,侵删。
2 OWASP Top10
注入、失效的身份认证、敏感信息泄露、XML外部实体(XXE)、失效的访问控制、安全配置错误、CSRF、不安全的反序列化、使用含有已知漏洞的组件、不足的日志记录和监控。
3 文件上传的攻击特征、利用条件、检测绕过、防御
3.1 攻击特征
HTTP请求方法是POST;请求头的content-type字段使用multipart/form-data规范;文件名属性的后缀为jsp, php, asp等;文件内容一般为Webshell。
3.2 利用条件
有上传功能;知道文件上传后的路径;上传后的文件可以访问;上传后的文件可以执行。
3.3 检测和绕过
3.4 文件上传防御
(1) 使用白名单限制可以上传的文件扩展而不是黑名单;
(2) 验证文件内容,正则匹配恶意代码;
(3) 对上传后的文件统一随机命名;
(4) 上传后的目录不能执行脚本;
(5) 限制.htaccess和.user.ini等配置文件上传;
(6) php版本更新,避免出现截断漏洞;
(7) 避免出现文件包含漏洞。
4 Webshell是什么?原理是什么?如何检测Webshell?
4.1 Webshell
Webshell就是以asp, php, jsp或者cgi等网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。但是脚本语言具有动态性,对于php文件来说,木马文件使用命令执行system函数或者代码执行eval函数等,参数为用户外部传入(如GET传参,POST传参),以此达到执行任意代码任意命令的功能,从而远程控制目标主机。
4.2 如何检测Webshell?
(1) 主机层面
静态检测:通过匹配特征码、特征值、危险函数来查找Webshell。优点是快速方便,对已知的Webshell查找准确率高。缺点是漏报率、误报率高,无法查找0day型Webshell,容易被绕过。如D盾进行全盘扫描。
动态检测:Webshell上传到服务器后,系统调用、系统配置、数据库、文件的操作动作和日志都可以作为判断依据,如IDS检测。
(2) 流量层面
菜刀、蚁剑、冰蝎、哥斯拉的流量特征。
5 PHP、JSP和ASP命令执行和代码执行相关函数
PHP命令执行:system, exec, shell_exec, popen, proc_open, ``(反引号)
PHP代码执行:eval, assert, call_user_func, create_function, preg_replace
JSP命令执行:Runtime.getRuntime().exec(), ProcessBuilder.start(), 反射
ASP命令执行:eval, execute, ExecuteGlobal
6 蚁剑、冰蝎、哥斯拉流量特征
6.1 蚁剑流量特征
蚁剑Webshell使用URL编码 + Base64、chr或者rot编码,默认随机前缀长度为2个字符,请求数据存在明文连接密码。对于php流量特征来说,请求数据经过URL解码后可以发现int_set(“display_errors”, “0”)和set_time_limit(0)字符串特征。
基于php和jsp的webshell流量特征解密过程是类似的。对于请求数据,流量分析需要先进行URL解码,再按照&分开各变量的值,接着去掉随机前缀字符后再Base64解码即可看到攻击者执行的命令。对于响应数据,则需要进行Base64、chr或者rot解码才能看到命令执行的结果。
6.2 冰蝎流量特征
冰蝎3.0和4.0的AES密钥为连接密码32位md5值的前16位,默认连接密码rebeyond。冰蝎对交互流量进行AES对称加密,而且加密密钥是由随机数函数动态生成,传统的WAF、IDS设备难以检测,所以说很难找到强特征。弱特征:默认内置的16个userAgent比较老;Accept可能为某固定值;通讯默认使用长连接。
流量解密:冰蝎4.0增加传输协议功能,允许用户自定义传输协议,并根据传输协议动态生成服务端webshell。基于php和jsp的webshell流量解密过程是类似的,这里以jsp流量解密为例。对于请求数据,首先查看webshell.jsp文件中的AES密钥;然后在wireshark中使用tcp.addr=114.116.107.196过滤关键流量,追踪HTTP流;接着通过黑伞安全的python脚本将请求数据转化为.class文件,使用Jadx打开,搜索cmd参数即可获得攻击者命令执行内容。对于响应数据,将其放在冰蝎的传输协议中解密,抽取msg参数的内容进行Base64解码即可获得命令执行的明文响应数据。
【注】php流量解密过程:将请求数据和响应数据分别放在传输协议中进行解密,然后将cmd和msg参数的值进行Base64解码即可获得执行的命令和真实的响应数据。
[1] http://s6e.cn/5smXD
[2] https://www.bilibili.com/video/BV1aB4y1b7aa/?spm_id_from=333.788&vd_source=9feea24c940263b79fcb1965556b48fc
[3] https://www.bilibili.com/video/BV1ZT411j7PQ/?spm_id_from=333.788&vd_source=9feea24c940263b79fcb1965556b48fc
6.3 哥斯拉流量特征
哥斯拉内置了3种Payload以及6种加密器,对交互流量进行AES对称加密。第一次的请求数据巨长;请求头的cookie最后是;字符串;请求数据开始处存在密钥=xxx的字符串;响应数据的特征为:md5前十六位+Base64字符串+md5后十六位。
【注】希潭实验室发布的蓝队分析辅助工具可以快速解密冰蝎和哥斯拉的流量。
7 CS特征检测和隐藏;Java内存马查杀
7.1 CS特征检测和隐藏
7.1.1 特征检测
teamserver默认端口50050;WAF检测默认证书cobaltstrike.store;检测HTTPS默认的Beacon上线证书;计算checksum8路径的ASCII之和并与256做取余操作,结果为92;检测TLS握手阶段的JA3和JA3S指纹。
7.1.2 隐藏特征
修改teamserver端口为不常见端口;利用keytool生成新证书替换掉默认证书;在cloudflare上申请私有pem证书;使用Malleable-C2-Profiles修改C2配置文件实现应用层流量混淆。
[1] https://paper.seebug.org/1922/
7.2 Java内存马查杀
7.2.1 定位
识别内存马特征(URL路径有memshell和shell字符串,蚁剑、冰蝎和哥斯拉的流量特征,使用Arthas通过JVM定位内存马)
7.2.2 查杀
运行时动态防御(禁止程序动态添加或注册相关组件,在注入的内存马中添加防御字节码进行禁用)
7.3 Arthas通过JVM定位Java内存马步骤
之前手工排查过Tomcat中的Java内存马,主要使用阿里开源工具Arthas通过JVM来定位内存马。首先使用mbean获取sevlet/filter列表,然后使用sc查看JVM已加载的类信息,接着使用jad反编译可疑类文件,最后放到D盾中扫描。
另外,内存马肯定是在内存中并且访问的时候有URL路径信息,因此可以heapdump出内存临时文件,然后使用strings命令查看内存临时文件并过滤POST请求,最终定位内存马。
7.4 正确处理Java内存马步骤
我当时是采取关闭服务器并恢复快照的操作,这样能够彻底删除内存马和复活马。而在实际应急过程中,首先应该封禁IP,然后综合使用全流量和EDR来查看进程和日志,最后配合运维使用4ra1n师傅的shell-analyzer工具删除内存马。
mbean | grep “name=/“
sc *.Filter
sc .Servlet
sc -d org.apache.jsp.behinder_005fshell_jsp
jad org.apache.jsp.behinder_005fshell_jsp
heapdump
strings /var/cache/tomcat/temp/heapdump2022-10-19-12-464292342944555007800.hprof| grep “POST /“
strings /var/cache/tomcat/temp/heapdump2022-10-19-12-464292342944555007800.hprof| grep -E “/webapps/.?!“| sort -u
8 XSS、CSRF、SSRF
XSS (Cross-Site Scripting) 跨站脚本攻击
CSRF (Cross-site Request Forgery) 跨站请求伪造
SSRF (Server-Side Request Forgery) 服务器端请求伪造
8.1 XSS
XSS是一种代码注入攻击,攻击者在可信网页中注入恶意脚本代码,当用户访问可信网页时触发恶意脚本而被攻击,攻击对象主要是用户。
8.1.1 XSS类型
反射型、存储型、DOM型
8.1.2 XSS防御
对用户的输入和URL参数进行过滤;对输出进行HTML实体编码;设置HttpOnly属性防止cookie被JavaScript盗取;设置内容安全策略(Content Security Policy, CSP)。
8.1.3 反射型和DOM型的区别
反射型是非持久化的,攻击者事先制作好攻击链接,然后欺骗用户去点击链接进而触发XSS代码;DOM型XSS是基于JavaScript的,不会与服务器和数据库进行交互。
8.1.4 在有shell的情况下,使用XSS实现对目标站的长久控制
① 在后台登录处加一段记录登录账号密码的JavaScript代码,当登录成功时,就把账号密码记录到一个生僻路径的文件中或者直接发到自己的网站文件中;
② 在登录后用户经常访问的文件中插入XSS代码。
8.2 CSRF
CSRF利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
8.2.1 利用条件
被攻击者登录受信任网站A,并在本地生成Cookie;在不登出A的情况下,访问危险网站B。
8.2.2 防护策略
同源检测、设置Samesite Cookie、在HTTP请求头的非cookie字段设置CSRF Token、验证码、双重cookie验证。
8.2.3 Samesite Cookie原理
浏览器Cookie中的SameSite属性可以取值Strict,Lax和None,其中Strict完全禁止第三方Cookie,只有当前网页的URL与请求目标一致时,才会带上Cookie。
8.3 SSRF
SSRF是服务端发起的,是一种由攻击者构造由服务端发起请求对内部系统进行攻击的安全漏洞。SSRF可以扫描内部网络;可以构造数据包攻击内部主机。
8.3.1 SSRF相关协议
http、file、dict、gopher
8.3.2 SSRF相关函数
file_get_contents()、readfile()、fopen()、fsockopen()、curl_exec()、curl_close();
8.3.3 SSRF防御
设置IP白名单、限制请求的端口、禁止不常用的协议、过滤返回的信息、统一错误信息、使用沙箱实现内网分离。
9 主从复制RCE、SSRF成功攻击MySQL的条件、MySQL 5.0上下版本的区别
9.1 SSRF攻击Redis,如果不能用save,还有什么利用方式?
SSRF攻击Redis可以通过未授权访问写webshell、写SSH公钥、写定时任务/etc/crontab反弹shell,而这些方法都是基于save命令。如果不能用save可以主从复制RCE,在4.x/5.x版本中,Redis提供主从模式,首先通过slaveof命令将目标Redis服务器设置为恶意Redis服务器的从机,同时fullresync请求会同步主机文件到从机;然后将dbfilename设置为exp.so;最后从机加载恶意so文件,即可执行命令。可以使用redis-rogue-server脚本进行主从复制RCE的利用。
2020年网鼎杯就有一道主从复制RCE的题目SSRFMe,首先使用0.0.0.0绕过验证获得hint.php文件;然后使用redis-server的python脚本来伪造redis服务;接着三次访问gopher协议+二次URL编码的payload,这个payload使用slaveof设置主从关系;最后就能反弹shell拿到flag文件。
9.2 MySQL被SSRF攻击成功的条件
(1) 无密码的未授权状态或者知道密码;
(2) 知道MySQL的用户名;
(3) 关闭TLS加密(设置了skip_ssl);
(4) 版本高于5.7。
9.3 MySQL 5.0以上和5.0以下的区别
5.0以下没有information_schema这个系统表,无法列表名等,只能暴力破解表名;5.0以下是多用户单操作,5.0以上是多用户多操作。
10 SQL注入类型、绕过、写Webshell、注入点判断和防御
10.1 SQL注入
就是通过把恶意SQL语句插入到能与SQL服务器交互的WEB表单、HTTP请求头等用户可控参数当中,再在后台与原SQL语句拼接,改变原先语法结构,最终被服务器执行。
10.2 类型
BEUSTQ布尔盲注、报错注入、联合注入、堆叠注入、时间盲注、内联注入、二次注入
–technique=TECH.. SQL injection techniques to use (default “BEUSTQ”)
10.3 常见端口
1433SQL Server、1521Oracle、3306MySQL、5432PostgreSQL、6379Redis、27017MongoDB
10.4 绕过WAF
(1) SQL语法层面(空格、双写、注释、换行等);
(2) HTTP层面(使用不同的编码传输hex, bin, ascii, ord, char, base64, unicode、使用分块传输)
10.5 SQL注入写WebShell的前提条件
知道Web目录位置、对目标目录具有写权限、magic_quotes_gpc函数关闭。
10.6 SQL注入写WebShell的方法
(1) 构造联合查询语句使用INTO OUTFILE将查询的输出重定向到系统的文件中,比如说“select 一句话木马 into outfile 目录文件”;
(2) 通过sqlmap的–os-shell参数生成命令执行和文件上传Webshell;
(3) 通过日志文件写Webshell:开启日志记录general_log记录用户执行的恶意SQL语句并保存在日志文件中,找到对应日志文件就能getshell。
10.7 SQL注入点判断
(1) 单引号和万能密码判断:在输入参数中添加单引号导致最后拼接的SQL语句单引号个数不匹配而报错,利用万能密码【’or 1=1#和’||’1】;
(2) 注入位置:GET、POST、HTTP头注入;
(3) 注入类型:字符型【注入变量使用单引号,注意闭合】、整型【注入变量不用单引号】;
(4) 逻辑运算和常用函数:根据and 1=1和and 1=2的返回页面状态判断是否存在布尔盲注,根据and sleep(5)观察页面响应时间判断是否存在时间盲注。
10.8 防御
对整个语句进行预编译;使用PDO预处理机制;正则表达式过滤;严格限制网站访问数据库的权限,落实权限最小化原则;数据类型严格定义,数据长度严格规定。
11 联合注入、报错注入、盲注、堆叠注入、二次注入和sqlmap的原理和常用函数
11.1 联合注入
联合注入通常利用order by查询列数,union select查询输出位置。
http://10.27.81.37/sqli/Less-1/?id=-1'order by 3–+
http://10.27.81.37/sqli/Less-1/?id=-1'union select 1,2,group_concat(schema_name) from information_schema.schemata–+
http://10.27.81.37/sqli/Less-1/?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()–+
http://10.27.81.37/sqli/Less-1/?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=’security’ and table_name=’users’–+
http://10.27.81.37/sqli/Less-1/?id=-1'union select 1,2,(select group_concat(id,0x7e,username,0x7e,password) from users)–+
11.2 报错注入
11.2.1 报错注入函数和原理
(1) BIGINT等数据类型溢出:exp()
(2) xpath语法错误:updatexml(), extractvalue()
(3) 主键重复:floor()
(4) 部分几何函数
11.2.2 报错注入原理
SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,而后台没有屏蔽数据库报错信息,使得查询结果出现在错误信息中并在前端回显,攻击者可以从报错信息中获取设定的信息。报错注入通常使用在能返回错误信息但是联合查询受限的情况中。
11.3 盲注
盲注并不能获取注入语句的查询结果,只能通过回显差异性判断注入是否成功,所以一般结合二分法来逐字爆破所需数据,分为布尔盲注和时间盲注。盲注通常使用在联合注入和报错注入受限的情况中,常见盲注函数有sleep, benchmark, get_lock。
布尔盲注:服务端只会根据注入语句返回True跟False,不会返回注入语句的查询结果和报错信息,根据返回页面的正常与否和内容差异判定是否查询成功。
时间盲注:无论输入任何语句,界面返回值只有True,而且返回内容没有任何变化。通过时间函数sleep,让结果延时返回,通过返回时长的差异判定是否查询成功。
11.4 堆叠注入
触发的条件很苛刻,需要服务器访问数据库时使用支持多条SQL语句同时执行的mysql_multi_query()函数,sqli-labs的38关就是堆叠注入。
11.5 二次注入
已经存储在数据库中的用户输入被读取后再次进入到SQL语句中导致的注入。以sqli-labs的24关为例,正常来说无法通过注入来登录admin,因为用户输入会被转义;首先注册用户admin’#并登录;接着修改用户admin’#的密码,由于用户名是从session中直接获取,没有进行转义,具体执行的SQL语句就变成UPDATE users SET PASSWORD=’$pass’ where username=’admin’#’ and password=’$password’,admin’#后面的内容被注释掉,达到任意密码修改的效果。
11.6 sqlmap
11.6.1 sqlmap参数和作用
11.6.2 sqlmap使用的基本流程
python sqlmap.py -u http://10.27.81.37/sqli/Less-1/?id=1 –dbs
python sqlmap.py -u http://10.27.81.37/sqli/Less-1/?id=1 -D security –tables
python sqlmap.py -u http://10.27.81.37/sqli/Less-1/?id=1 -D security -T users –columns
python sqlmap.py -u http://10.27.81.37/sqli/Less-1/?id=1 -D security -T users -C “id,password,username” –dump
11.6.3 使用sqlmap注入https网站的方法
因为sqlmap无法伪造SSL证书,所以无法直接注入https网站。可以通过Burpsuite本地代理端口进行访问,再加上–force-ssl参数即可注入。
python sqlmap.py -u URL –dbs –proxy http://10.27.81.37:8888 –force-ssl
12 前端存在弱口令,怎么绕过验证码?
12.1 客户端问题
(1) 网站验证码由本地JS生成并只在本地用JS验证。可以在本地禁用JS,然后重放删除过验证字段的HTTP请求包来绕过。
(2) 网站把验证码输出到响应头或HTML。可以使用Burpsuite的Intruder模块的Pitchfork来正则匹配响应报文的验证码进行绕过。
(3) 网站默认不显示验证码,开发人员可能在Cookie中写入用来记录错误次数的标记loginErr,在输入错误一定次数后才需要输入验证码。可以通过不更新Cookie中的loginErr标记进行绕过。
12.2 服务端问题
(1) 验证码不过期或者没有及时销毁会话导致同一验证码能重复使用。可以在Cookie中带固定的sessionID和固定的验证码进行绕过。
(2) 没有对验证码进行非空判断。可以直接删除验证码参数进行绕过。
(3) 产生的验证码功能薄弱。在前端源码找到生成验证码的函数URL,然后配合Burpsuite的验证码识别插件captcha-killer识别验证码,最后Intruder爆破即可。
[1] https://www.cnblogs.com/4geek/archive/2023/02/22/17145385.html
13 如何判断一个网站(挂了CDN)的真实IP地址;同源策略和跨域
13.1 如何判断一个网站(挂了CDN)的真实IP地址
(1) 多地ping(可以使用站长工具https://ping.chinaz.com/来多地ping待确认域名,小网站多地ping还可行,大网站本身IP数较多,不一定能判断真实IP)
(2) 子域名查找(因为CDN和反向代理是需要成本的,有的网站只在比较常用的域名使用,可以通过一些没来得及加入CDN和反向代理的测试域名和新的子域名来查找网站的真实IP)
(3) IP历史记录查询法(有的网站是后来才加入CDN的,所以只需查询它的解析历史即可获取真实IP,使用https://viewdns.info/或者https://dnsdumpster.com/就可能根据域名找到真实IP)
(4) 网站漏洞查找法(通过网站的信息泄露如phpinfo泄露,github信息泄露,命令执行等漏洞获取真实IP)
(5) 网站邮件订阅法(可以通过网站订阅邮件的功能,让网站给自己发邮件,查看邮件的源代码或者信头即可获取网站真实IP)
13.2 同源策略和跨域
同源策略是浏览器的一个协议,浏览器规定,任意两个页面的URL同协议、同域名、同端口才被称之为同源,同源页面可以相互读取页面资源和执行页面脚本,如果不是同源页面,就不被允许上述操作。
跨域解决方案:标签(script, link, img);JSONP和CORS;Nginx设置反向代理;document.domain设置为同域。
14 阿里云盾WAF、安骑士HIDS、长亭谛听蜜罐使用体验
14.1 阿里云盾WAF
(1) 当时使用最多的功能就是针对9个域名在网站防护的自定义防护策略中封禁IP地址,但是当时遇到需要一次性封禁6000多个IP的需求,我就没办法了,因为云盾只能在一个规则最多添加5个条件,每个条件封禁50个IP地址,最多一个规则封禁250个IP地址,项目经理说他找运维进行批量封禁,感觉这是云盾需要改进的地方;
(2) 使用智能语义检测来识别风险,降低规则条数和运营成本;
(3) 阿里云后台更新WAF防护策略,无法提前预知策略是否对公司的web应用产生影响。
14.2 安骑士HIDS
(1) 当时有一次协助项目经理在风险感知模块对系统进行弱口令和合规基线扫描。对于弱口令,扫描出来12个MySQL服务的弱口令,然后立刻反馈给项目经理进行整改;对于合规基线,扫描的时候突然引发HIDS告警,钉钉群的机器人发送安全告警,我立刻给项目经理反馈,最终经过排查后发现是正常的合规基线扫描引发安全告警,属于误报。
(2) 能够实现平台级的安全运营,包括安全评分、风险告警、安全报告、钉钉告警推送,当时其他师傅配置钉钉告警推送,如果HIDS有入侵检测日志就会给钉钉群发送消息,这个功能的确挺好;
(3) 安骑士HIDS主界面包括态势报告、资产清点、风险感知、入侵检测和安全防护,功能齐全,不过阿里云官网已经下架安骑士HIDS,推荐使用云安全中心态势感知,可能是后续产品的功能更加完善吧。
14.3 长亭谛听蜜罐
(1) 功能丰富,主界面包括威胁日志、蜜罐管理、探针管理、用户管理和系统配置,其中威胁日志又包括蜜罐入侵日志、端口扫描日志、Ping扫描日志和ARP欺骗日志,当时主要关注威胁日志中的蜜罐入侵日志,项目经理说如果出现蜜罐入侵日志,我们就该卷铺盖走人了;
(2) 另外,谛听还能通过邮件、短信发送告警信息,对攻击源攻击者进行画像分析,甚至反制。
(3) 攻击者使用BurpSuite工具访问Web蜜罐时,蜜罐可识别BurpSuite特征,并利用BurpSuite漏洞获取攻击者真实IP。
【注】三者操作简单,没有太多配置项,大部分功能只需选择开启或关闭。
15 更改默认端口怎么渗透;为何MySQL的网站只有80端口开放;3389端口无法连接的几种情况
15.1 更改默认端口怎么渗透
使用端口扫描工具nmap进行全端口扫描,然后再逐一探测端口服务版本,根据返回的指纹信息判断运行的服务。
nmap -p0-65535 203.195.71.19 -T5
nmap -sV -p3306 203.195.71.19
15.2 为什么MySQL的网站只有80端口开放?
(1) 因为更改默认端口而没有扫描出来
(2) 使用站库分离
(3) 3306端口不对外开放
15.3 3389端口无法连接的几种情况
(1) 没开放3389端口或者端口被修改
(2) 服务器处于内网,需端口转发才能连接
(3) 防火墙阻止不可信来源IP访问
(4) 安全组指定IP才能连接
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。