1.上传漏洞
原理·
由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件,
并通过此脚本文件获得了执行服务端命令的能力。
危害
1、代码执行
上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行;
2、域控
上传文件是flash的策略文件crossdomiain.xml,黑客用以控制flash在该域下的行为;
3、网站挂马
上传文件是病毒、木马,黑客用以诱骗用户或者管理员下载执行;
4、钓鱼
上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
防御
将上传文件与web服务隔离
白名单过滤、限制上传文件类型
文件上传路径设置为不可执行权限
检查文件上传路径
自带函数检测
自定义函数检测
图片渲染
对上传文件重命名
对文件内容压缩,重新生成文件内容
检查文件内容
绕过方式
客户端检测:客户端使用JavaScript检测,在文件未上传时,就对文件进行验证。(使用FireBug,中间人攻击)
服务器端检测:服务端脚本一般会检测文件得MIME类型,检测文件扩展名是否合法,甚至有些程序员检测文件中是否嵌入恶意代码。(黑白名单验证,MIME验证,目录验证,截断上传攻击)
解析漏洞
通常攻击者在利用上传漏洞时,会与web容器的解析漏洞配合在一起使用。常见的web容器有IIS/Nginx/Apache/Tomcat等。
IIs解析漏洞
iis6.0在解析文件时存在两个解析漏洞
1.当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被iis当作asp文件来解析
2.当文件为*.asp;1.asp时,iis6.0同样会以ASP脚本来执行,如:新建文件test.asp;1.jpg,内容为<%=NOW()%>。
附提一个经典漏洞(WebDav)具体复现可自行查阅。IIS Write 利用这款工具可快速探测服务器是否存在WebDav的安全隐患。
Apache解析漏洞
Apache在解析文件时有一个原则:当碰到不认识的扩展名时,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。有些程序开发人员在上传文件时,判断文件名是否是PHP,ASP,ASPX,ASA,CER,ASPX等脚本扩展名,如果是,则不允许上传,这时攻击者就有可能上传1.php.rar等扩展名来绕过程序检测,并配合解析漏洞,获取到webshell。
/还有很多可自行查阅/
构造的一句话木马(常用的一句话得知道),你需要知道PHP,JSP,ASP这些语言使用的不同函数
例如:php一句话木马常用函数eval()、assert()、preg_replace()等。
这个模板有很多内容要学,可以自己多看看,多写一些,面试官偶尔会问到。
常使用工具:菜刀,蚁剑,冰蝎等
文件包含
原理
一般把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般被称为包含。为了使代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
php包含
php中提供四个文件包含的函数.
include() 找不到被包含的文件时会产生致命错误,并停止脚本;
include_once() 找不到被包含的文件时只会产生警告,脚本继续执行;
require() 此语句和include()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含;
require_once() 此语句和require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
php文件包含利用(本地包含/远程包含)
1.读取敏感文件
2.远程包含shell
3.本地包含配合文件上传
4.使用php封装协议
5.包含Apache日志文件
6.截断包含
/具体实现理解实现需自己多动手/
JSP包含
动态包含、静态包含 /具体实现理解实现需自己多动手/
防御
1.严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点在于被包含的文件是否可被外部控制;
2.路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符。
3.包含文件验证:验证被包含的文件是否是白名单中的一员。
4.尽量不要使用动态包含,可以在需要包含的页面固定写好。
sql注入
原理
由于程序对用户输入的数据的合法性没有进行严格的判断和处理,导致攻击者可以在web应用程序预先定义好的SQL语句中添加额外的SQL语句,在管理员不知情的的情况下,来欺骗数据库服务在没有授权的情况下执行任意查询,进一步获得数据库信息(每个人都有自己得理解,最好能说出自己的理解)
危害
数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。攻击者未经授权可以访问数据库中的数据
网页篡改:通过操作数据库对特定网页进行篡改。
网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。网站目录存在写入权限
数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号
经过提权等步骤,服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
破坏硬盘数据,瘫痪全系统。
防御
使用安全的API
使用正则表达式提交字符串过滤、采用前端加服务端过滤,
安全函数,对敏感字符进行转义
不显示数据库错误
预编译,
强迫使用参数化语句
最小权限,只给访问数据库的WEB应用最小权限
重要信息加密存储
使用安全防护产品
拒绝风险IP,短时间大量访问
注入类型
Boolean盲注
Union注入
文件读写
报错注入{
floor报错注入
ExtractValue报错注入
UpdataXml报错注入 }
时间盲注
REGEXP正则匹配
宽字节注入
堆叠注入
二次注入
User-Agent注入
Cookie注入
过滤绕过
万能密码
时间盲注除了sleep函数还有哪些函数!
宽字节注入原理
拿到一个注入点如何做
sqlmap的一些参数使用
redis未授权访问
常见的错误函数(12个)
数据库有哪些提取方法
预编译绕过方法
sql注入常见面试题
如何判断sql注入,有哪些方法
提交错误语句是否有异常,除此之外这些显示的错误可以通过sleep,修改语句执行5秒等,除此之外通过DNSlog判断是还有传回值
如何判断 SQL 注入漏洞成因
select * MSSQL差异备份原理及条件from news where id = ‘$SQL’;
当程序执行访问新闻等一些操作都会执行到sql语句进行调用,如果在此调用过程中,提交了不合法的数据,而数据库无法识别则会报错。也就是一切输入都是有害的。
SQL注入原因:
①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当
以下链接存在 sql 注入漏洞,对于这个变形注入,你有什么思路?
demo.do?DATA=AjAxNg== DATA有可能经过了 base64 编码再传入服务器,所以我们也要对参数进行 base64 编码才能正确完成测试
注入方式有哪些?
从注入参数类型分:数字型注入、字符型注入、搜索型注入 从注入方法分:基于报错、基于布尔盲注、基于时间盲注、联合查询、堆叠注入、内联查询注入、宽字节注入 从提交方式分:GET注入、POST注入、COOKIE注入、HTTP头注入
SQL头注入点
· UserAgent
· Referer
· Cookie
· X-Forwarded-For IP
Cookie注入典型步骤
1.寻找形如“.asp?id=xx”类的带参数的URL。
2.去掉“id=xx”查看页面显示是否正常,如果不正常,说明参数在数据传递中是直接起作用的。
3.清空浏览器地址栏,输入“javascript:alert(document.cookie=“id=”+escape(“xx”));”,按Enter键后弹出一个对话框,内容是“id=xx”,然后用原来的URL刷新页面,如果显示正常,说明应用使用Request(“id”)这种方式获取数据的。
4.重复上面的步骤,将常规SQL注入中的判断语句带入上面的URL:“javascript:alert(document.cookie=“id=”+escape(“xx and 1=1”));” “javascript:alert(document.cookie=“id=”+escape(“xx and 1=2”));”。和常规SQL注入一样,如果分别返回正常和不正常页面,则说明该应用存在注入漏洞,并可以进行cookie注入。
5.使用常规注入语句进行注入即可。
除了数据库数据,利用方式还有哪些?
利用方式:具体看什么数据库类型,像SQLSERVER可以命令执行,MYSQL写shell有些权限大也可以执行命令但是条件是在LINUX环境下。
为什么有的时候没有错误回显
没有进行错误打印或者错误屏蔽
mysql的网站注入,5.0以上和5.0以下有什么区别?
5.0以下没有informationschema这个系统表,无法列出表名列名,只能暴力跑表名。5.0以下是多用户单操作,5.0以上是多用户多操做。
mysql写shell有几种方法
outfile、dumpfile、开启log写webshell
mysql的用户名密码是存放在那张表里面?
mysql -> users
mysql密码采用哪种加密方式?
SHA1 安全散列算法1
找到一个注入点怎么判断对方什么数据库
常见的数据库Oracle、MySQL、SQL Server、Access、MSsql、mongodb等
关系型数据库:由二维表及其之间的联系组成的一个数据组织。如:Oracle、DB2、MySql
1.是否可以使用特定的函数来判断,该数据库特有的
len()函数:mssql、mysql、db2
length()函数:Oracle、informix
substring:mssql
substr:oracle
version()>1 返回与@@version>1 相同页面时,则可能是mysql。如果出现提示version()错误时,则可能是mssql。
2.是否可以使用辅助的符号来判断,如注释符号、多语句查询符等等
/* mysql特有注释符,返回错误说明不是mysql
– 是Oracle和MSSQL支持的注释符,如果返回正常,则说明为这两种数据库类型之一。继续提交如下查询字符
; 是子句查询标识符,Oracle不支持多行查询,因此如果返回错误,则说明很可能是Oracle数据库。
;-- 在注入点后加分号、斜杠、斜杠,返回正常是mssql,返回错误是ACCESS
3.是否可以编码查询
4.是否显可以利用错信息
错误提示Microsoft JET Database Engine 错误 ‘80040e14’,
JET是ACCESS数据库
ODBC是MSSQL数据库
5.是否存在数据库某些特性辅助判断
and exists (select count() from sysobjects) 返回正常是mssql
and exists (select count() from msysobjects) 两条,和上一条返回都不正常是ACCESS
如果是字符型,参数后加 ’ 最后加 ;–
报错注入的函数有哪些?10个
1)and extractvalue(1, concat(0x7e,(select @@version),0x7e))
2)通过floor报错 向下取整
3)+and updatexml(1, concat(0x7e,(secect @@version),0x7e),1) 4).geometrycollection()select from test where id=1 and geometrycollection((select from(selectfrom(select user())a)b)); 5).multipoint()select from test where id=1 and multipoint((select from(select from(select user())a)b));
6).polygon()select from test where id=1 and polygon((select from(select from(select user())a)b));
7).multipolygon()select from test where id=1 and multipolygon((select from(select from(select user())a)b));
8).linestring()select from test where id=1 and linestring((select from(select from(select user())a)b));
9).multilinestring()select from test where id=1 and multilinestring((select from(select from(select user())a)b)); 10).exp()select from test where id=1 and exp(~(select * from(select user())a));
延时注入如何来判断?
if(ascii(substr(“hello”, 1, 1))=104, sleep(5), 1)
盲注和延时注入的共同点?
都是一个字符一个字符的判断
盲注是什么?怎么盲注?
盲注是在SQL注入攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在SQL注入和利用的方式。盲注的手段有两种,一个是通过页面的返回内容是否正确(boolean-based),来验证是否存在注入。一个是通过sql语句处理时间的不同来判断是否存在注入(time-based),在这里,可以用benchmark,sleep等造成延时效果的函数,也可以通过构造大笛卡儿积的联合查询表来达到延时的目的。
mysql注入点,用工具对目标站直接写入一句话,需要哪些条件?
root权限以及网站的绝对路径。
宽字符注入的原理?
在mysql中使用了gbk编码,占用2个字节,而mysql的一种特性,GBK是多字节编码,它认为两个字节就代表一个汉字,所以%df时候会和转义符\ %5c进行结合,所以单引号就逃逸了出来,当第一个字节的ascii码大于128,就可以了
宽字节注入产生原理以及根本原因
产生原理
在数据库使用了宽字符集而WEB中没考虑这个问题的情况下,在WEB层,由于0XBF27是两个字符,在PHP中比如addslash和magic_quotes_gpc开启时,由于会对0x27单引号进行转义,因此0xbf27会变成0xbf5c27,而数据进入数据库中时,由于0XBF5C是一个另外的字符,因此\转义符号会被前面的bf带着"吃掉",单引号由此逃逸出来可以用来闭合语句。
根本原因
character_set_client(客户端的字符集)和character_set_connection(连接层的字符集)不同,或转换函数如,iconv、mb_convert_encoding使用不当。
解决办法
统一数据库、Web应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为UTF-8。或对数据进行正确的转义,如mysql_real_escape_string+mysql_set_charset的使用。
sql里面只有update怎么利用
先理解这句 SQL
UPDATE user SET password=‘MD5( p a s s w o r d ) ′ , h o m e p a g e = ′ password)', homepage=' password)′,homepage=′homepage’ WHERE id=‘$id’
如果此 SQL 被修改成以下形式,就实现了注入
1:修改 homepage 值为http://xxx.net’, userlevel='3
之后 SQL 语句变为
UPDATE user SET password=‘mypass’, homepage=‘http://xxx.net’, userlevel=‘3’ WHERE id=‘$id’
userlevel 为用户级别
2:修改 password 值为mypass)’ WHERE username=‘admin’#
之后 SQL 语句变为
UPDATE user SET password=‘MD5(mypass)’ WHERE username=‘admin’#)', homepage=‘ h o m e p a g e ′ W H E R E i d = ′ homepage' WHERE id=' homepage′WHEREid=′id’
3:修改 id 值为’ OR username=‘admin’ 之后 SQL 语句变为
UPDATE user SET password=‘MD5( p a s s w o r d ) ′ , h o m e p a g e = ′ password)', homepage=' password)′,homepage=′homepage’ WHERE id=‘’ OR username=‘admin’
SQL如何写shell/单引被过滤怎么办
写shell: root权限,GPC关闭,知道文件路径 outfile函数
http://127.0.0.1:81/sqli.php?id=1 into outfile ‘C:\wamp64\www\phpinfo.php’ FIELDS TERMINATED BY ‘’
http://127.0.0.1:81/sqli.php?id=-1 union select 1,0x3c3f70687020706870696e666f28293b203f3e,3,4 into outfile ‘C:\wamp64\www\phpinfo.php’
宽字节注入
代替空格的方法
%0a、%0b、%a0 等 /**/ 等注释符 <>
注入时可以不使用and 或or 或xor,直接order by 开始注入吗?
and/or/xor,前面的1=1、1=2步骤只是为了判断是否为注入点,如果已经确定是注入点那就可以省那步骤去。
1.最佳方法:预编译语句,绑定变量。使用预编译的SQL语句,SQL的语意不会变化,攻击者无法改变SQL的结构,即使攻击者插入了类似于’or ‘1’=’1的字符串,也只会将此字符串作为username查询。
2.从存储过程来防御:先将SQL语句定义在数据库中,存储过程中可能也存在注入问题,应该尽量避免在存储过程中使用动态SQL语句。
3.从数据类型角度来防御:限制数据类型,并统一数据格式。
4.从开发者角度来防御:开发时尽量用安全函数代替不安全函数,编写安全代码。危险函数,常见的执行命令函数,动态访问函数,如C语言中的system(),PHP的eval(),JSP的include()导致的代码越权执行,都是注入。
5.从数据库管理者角度来防御:的最小权限原则,避免root,dbowner等高权限用户直接连接数据库。
为什么参数化查询可以防止sql注入
原理:
使用参数化查询数据库服务器不会把参数的内容当作sql指令的一部分来执行,是在数据库完成sql指令的编译后才套用参数运行
简单的说: 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑
sqlmap时间延时注入的命令
sqlmap,怎么对一个注入点注入?
注入方式 1) 如果是get型,直接sqlmap -u “注入点网址” 2) 如果是post型,可以sqlmap -u "注入点网址” --data=“post的参数” 3)如果是cookie型,用burpsuite抓包,注入处用*号替换,放到某文件里,然后sqlmap -r “文件地址”
mssql的三个权限以及他们注入的利用过程
SA权限下扩展存储攻击利用方法
当MsSQL注入点具备sa权限时,只需提交各种扩展存储查询语句,就可以实现危害极大的攻击。
dbo_wner权限下的扩展攻击利用
当数据库连接账户为dbowner权限时,无法直接利用扩展存储执行各种系统命令,进行攻击的过程比较烦琐。
当注入点为dbo权限时,通常首先利用xp_dirtree扩展存储列出Web目录,然后利用SQL语句创建一个临时表,插入一句话木马到临时表中。然后利用数据库备份语句,将数据库备份到Web目录并保存为ASP格式的文件,即可得到一个一句话木马后门。最后利用一句话木马客户端连接后门,得到WebShell后就可以控制整个服务器了。
public权限
第一步:获取当前网站数据库名称
第二步:获取mssql所有数据库名和路径
第三步:获取当前数据库所有表名
第四步:爆表名及字段名(建议)
第五步:获取字段内容
SQL与NoSQL的区别?
SQL:关系型数据库 NoSQL:非关系型数据库
存储方式:SQL具有特定的结构表,NoSQL存储方式灵活 性能:NoSQL较优于SQL 数据类型:SQL适用结构化数据,如账号密码;NoSQL适用非结构化数据,如文章、评论
常见的关系型数据库?
mysql、sqlserver、oracle、access、sqlite、postgreSQL
常见的数据库端口?
关系型:
mysql:3306 sqlserver:1433 orecal:1521 PostgreSQL:5432 db2:50000
非关系型:
MongoDB:27017 redis:6379 memcached:11211
简述数据库的存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。
InnoDB:主流的存储引擎,mysql默认存储引擎 MyISAM:查询、插入速度快,不支持事务 MEMORY:hash索引、BTREE索引
Mysql一个@和两个@什么区别
一个@是用户自定义变量 两个@是系统变量,如@@version、@@user
如果存在SQL注入怎么判断不同的数据库?
根据报错信息判断 根据执行函数返回的结果判断,如len()和lenth(),version()和@@version等 根据注释符判断
xss/csrf/ssrf
XSS跨站点脚本攻击
原理
(利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料,利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式
三种主要类型反射型 存储型 dom型等
危害
网络钓鱼
窃取用户Cookie
弹广告刷流量
篡改改页面信息
获取客户端信息
传播蠕虫
利用网站重定向。
防御
对输出数据进行编码和转义
对输入数据进行严格过滤
给关键cookie 使用 http-only
xss的利用方式
标签闭合
大小写等
存储型xss与反射性xss,dom型xss的区别
具有更高的隐蔽性,危害性也更大。他们之间最大的区别在于反射型xss与Dom型xss执行都必须要依靠用户手动去触发,而存储型不需要
CSRF跨站伪请求
原理
攻击者通过跨站请求,以合法的用户的身份进行非法操作。
黑客借助受害者的cookie骗取服务器的信任,但是黑客并不能获取到cookie,也看不到cookie的内容。另外,由于游览器同源策略的限制,黑客无法从返回的结果中得到任何东西,csrf所能做的就是给服务器发送请求
危害
篡改目标网站上的用户数据`
盗取用户隐私数据
传播CSRF蠕虫
防御
安全框架、例如 Spring Security
refer识别
token机制
验证码
SSRF漏洞
原理
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
危害
请求任意URL数据
攻击web应用程序
攻击内网应用程序(利用开协议通信技术)
探测内网主机存活
读取内网文件信息
DOS攻击(请求大文件)
防御
1.让服务端去访问相应的网址
2.让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms
3.可以使用file、dict、gopher[11]、ftp协议进行请求访问相应的文件
4.攻击内网web应用(可以向内部任意主机的任意端口发送精心构造的数据包{payload})
5.攻击内网应用程序(利用跨协议通信技术)
6.判断内网主机是否存活:方法是访问看是否有端口开放
7.DoS攻击(请求大文件,始终保持连接keep-alive always)
查找
漏洞常见出没位置
所有调外部资源的参数都有可能存在ssrf漏洞
1)分享功能:通过URL地址分享网页内容
2)转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3)在线翻译:给网址翻译对应网页的内容
4)图片加载与下载:通过URL地址加载或下载图片
5)图片、文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6)未公开的api实现以及其他调用URL的功能
7)从URL关键字中寻找
XSS与CSRF的区别
(1)CSRF比XSS漏洞危害更高。
(2)CSRF可以做到的事情,XSS都可以做到。
(3)XSS有局限性,而CSRF没有局限性。
(4)XSS针对客户端,而CSRF针对服务端。
(5)XSS是利用合法用户获取其信息,而CSRF是伪造成合法用户发起请求。
XXE外部实体注入
原理
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,
造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。
xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
危害
文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击
防御
过滤用户提交的XML数据:
过滤关键词:
禁用外部实体
逻辑漏洞
逻辑漏洞主要有 任意密码修改、越权访问,密码找回,交易支付金额修改等
挖掘逻辑漏洞操作步骤
1.发现网站所提供的功能模块。比如:修改密码,找回密码,修改个人资料。
2.针对具体的功能确定业务流程,详细划分具体步骤。
3.拦截HTTP/HTTPS请求,分析其参数的含义。
4.修改参数值,尝试触发逻辑漏洞。
5.返回步骤2,对其他功能继续测试。
/重点在于业务流程和HTTP/HTTPS请求篡改/
逻辑漏洞之找回机制及接口安全
找回重置机制
客户端回显,Response状态值,验证码爆破,找回流程绕过
接口调用乱用
短信轰炸,来点轰炸
找回密码验证码逻辑-爆破测试-实例墨者靶场密码重置-验证码套用-靶场手机邮箱验证码逻辑-客户端回显-实例绑定手机验证码逻辑-Rep状态值篡改-实例某APP短信轰炸接口乱用-实例接口调用发包
逻辑越权之登录脆弱及篡改安全
一、登录应用功能点安全问题
检测功能点,检测,危害,修复方案
1.登陆点暴力破解
2.HTTP/HTTPS传输
3.Cookie脆弱点验证
4.session固定点传输
5.验证密文
二、数据篡改安全问题
原理,检测,危害,修复
支付漏洞一直以来就是是高风险,对企业来说危害很大,对用户来说同样危害也大。
修改支付价格
在支付当中,购买商品一般分为三步骤:订购、确认信息、付款。
那么这个修改价格具体是修改哪一步时的价格呢?在我看来,你可以在这三个步骤当中的随便一个步骤进行修改价格测试,如果前面两步有验证机制,那么你可在最后一步付款时进行抓包尝试修改金额,如果没有在最后一步做好检验,那么问题就会存在,其修改的金额值你可以尝试小数目或者尝试负数。改为负数直接导致支付时的金额变成0元
修改支付状态
修改支付状态为已支付状态这样的思路,这个问题是没有对支付状态的值跟实际订单支付状态进行校验,导致点击支付时抓包修改决定支付或未支付的参数为支付状态的值从而达到支付成功。
修改购买数量
在支付的过程中,数量也同时决定着价格,比如:1个数量商品对应的是100,2个数据就是200,那么当你修改这个值数量值为负数时,那么其金额也会变为负数,最后就会导致支付问题的产生。
修改附属值
①:修改优惠劵金额
优惠劵其基本都是优惠一半,一般用优惠劵进行消费一般出现在第二个步骤当中:确认购买信息,在这个步骤页面当中,你可以选择相关优惠劵,然后直接修改金额大于或等于商品的价格就可以,或者直接修改其为负值进行尝试,最后进行支付,如果对这点没有加以验证,那么问题就会产生,直接支付成功。
②:修改优惠劵金额及业务逻辑问题
可能你看到这个标题会想到,你不是上一个讲的就是这个修改优惠劵金额的问题嘛?为什么还要再讲一遍这个?请继续看!
之前遇到过这个漏洞,这个漏洞也是逻辑问题导致了成功利用,同样在是在第二部确认购买信息当中有可选择优惠劵进行支付,但是,当你修改其优惠劵值为任意值或负值想要支付的时候,会回显支付失败,或者金额有误等一些提示,可能这时很多白帽子会很失望然后就会去其它点找问题了,但当你找到个人中心,点击订单详情,如果存在这个逻辑问题,那么此时在你刚刚修改优惠劵金额后点击下一步支付的时候,其实这时候就已经产生了订单了,你在订单详情内就可以看到支付金额为0,因为你刚刚修改了优惠劵金额嘛,然后你点击支付就可以支付成功。
当然,这里还要说下小技巧,有可能会支付失败,但是如果你找到的这个问题是一个一般业务分站点,如果有自带的一个钱包功能,那么你就可以利用这个只带的钱包功能去支付这个订单,而不要利用其它支付类型,那么就可以支付成功!
③:修改积分金额
有些网站有积分,比如你消费多少,评论多少就可以拥有一定的积分数量,这个积分可以在你付款的时候进行折扣其订单金额,如果这个没有做好积分金额的校验,那么当你在支付当中选择用积分为账户减一些金额的时候,可以抓包修改其积分金额为任意数或负金额,然后可0元支付成功。
三、常见篡改参数:
商品编号ID,购买价格,购买数量,支付方式,订单号,支付状态
四、常见修改方式
替换支付,重复支付,最小额支付,负数支付,溢出支付,优惠券支付
HTTP/HTTPS 协议密文抓取
后台登录账号密码爆破测试
cookie脆弱点验证修改测试
某商城系统商品支付逻辑测试数量,订单
某建站系统商品支付逻辑测试价格,订单
1、逻辑越权之水平垂直越权全解
图片
图片
水平和垂直越权
水平越权:可以获得同级别用户权限
垂直权限:享受高几个层次的用户权限
解释,原理,检测,利用,防御
通过更换的某个ID之类的身份标识,从而使得A账号获取(修改,删除)B账号的数据,通过低权限身份的账号,发送高权限才能有的请求,获得其高权限的操作。
通过删除请求中的认证信息后重放该请求,依旧可以访问或者完成操作。
原理
前端安全造成:界面
后端安全造成:数据库
修复防御方案
前后端同时对用户输入信息进行校验,双重验证机制
调用功能前验证用户是否有权限调用相关功能
执行关键操作验证用户身份,验证是否有操作数据的权限
直接对象引用的资源ID,防止攻击者枚举ID,敏感数据特殊化处理
对可控参数进行严格的检查和过滤
演示
pikachu-本地水平垂直越权演示
墨者水平-身份验证失效漏洞实战
越权检测-小米范越权漏洞检测工具
越权检测-Burpsuite插件Authz安装测试
逻辑越权之验证码与Token及接口
验证码安全
原理
验证生成或验证过程中的逻辑问题
危害
账户权限泄漏,短信轰炸、遍历、任意用户操作等
漏洞
客户端回显
验证码未失效(或永久有效)
验证远程绕过
可以使用正确的数据包去替换输错验证码的数据包,有可能不用输入其他内容即可绕过。漏洞产生的原因就是,验证码是永久有效,或者说首次验证成功以后,还是将验证码保存在Session或其他缓存中,并没有生效,那么就可以在验证码失效之前,继续利用该验证码来绕过。
绕过本地验证
php、html可以直接在浏览器中看到源代码,可以通过分析源代码实现绕过。比如在提交数据包的之前,将前端生成和验证验证码的代码删掉,即可实现绕过。
简单理解Token机制
什么是Token?
因为HTTP是一种无状态协议,所以是没办法记住用户的登录状态的。所以客户端每次请求都需要验证身份,最早的解决方案是:当用户请求登录成功,在服务端生成一条记录,然后把记录id发送给客户端,客户端收到以后把这个id存储在cookie里,下次该用户再次向服务端发送请求的时候,可以带上这个cookie,这样服务端会验证一下cookie里的信息,看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。其实这种方案就是利用session,id值其实就是sessionid。那我们既然可以使用session进行身份验证,我们为什么还要选择使用token呢?
session是需要空间进行存储的,如果是多服务器session需要服务器之间同步信息,但是token在服务器是可以不需要存储用户信息的。
token可以使用浏览器的localStorge等,APP也可以使用自带数据库存储字符串。且不会像cookies出现跨域问题。
token可以用JWT来携带部分不太敏感的信息比如用户ID等,服务器只要解密token即可使用部分信息。
Token验证流程
当用户登录成功之后, 服务器端就会通过指定算法生成一个 token,过期时间48h,可以将token存储在redis,再将这个token值返回给客户端;
客户端拿到 token值之后,进行保存;
当客户端调用接口请求数据时,就会携带 token值发送给服务器;
服务器接收到客户端的请求之后,会取出token值与保存在redis中的token值做对比。
如果token对比成功,说明用户处于登录状态,否则表示登录状态失效,需要用户重新登陆。用户每次重新登陆会刷新token的过期时间。
Token安全
基于验证码同理,主要是验证中可存在绕过可继续后续测试。
Token爆破、回显等。
未授权访问
Jboss未授权访问
Jenkins
ldap
redis
ES
MongoDB
Zookeeper
命令执行漏洞
应用系统从设计上需要给用户提供指定的远程命令操作的接口
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。
系统命令执行函数
system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec()
PHP命令执行(需详细了解)
java命令执行(需详细了解)
框架执行漏洞(Struts2,ThinkPHP等)(同)
渗透测试流程
信息收集
1.获取域名的whois信息,获取注册者邮箱姓名电话等。
2.查询服务器旁站以及子域名站点,因为主站一般比较难,所以先看看旁站有没有通用性的cms或者其他漏洞
3.查看服务器操作系统版本,web中间件,看看是存在已知的漏洞,比如iis,apache,nginx的解析漏洞
4.查看ip,进行IP地址端口扫描,对响应的端口进行漏洞探测,比如rsync,心脏出血
5.扫描网站目录结构,看看是否可以遍历目录,或者敏感文件泄露,比如php探针
6 google hack 进一步探测网站的信息,后台,敏感文件(site 指定域名 ,intext正文中存在关键字的网页,intitle标题中存在关键字的网页,info 一些基本信息 inurl URL存在关键字的网页 filetype 搜索指定文件类型 ep:intitle:登录管理 filetype:php, 这句话的意思为查询网页标题含有管理登录,并且为php类型的网站。
2)漏洞扫描
开始检测漏洞,如xss,xsrf,sql注入,代码执行,命令执行,越权访问,目录读取,任意文件读取,下载,文件包含,远程命令执行,弱口令,上传,编辑器漏洞,暴力破解等
3)漏洞利用
利用以上的方式拿到webshell,或者其他权限
4)权限提升
提权服务器,比如windows下mysql的udf提权,serv-u提权,windows低版本的漏洞,如iis6,pr,巴西烤肉,Linux内核版本漏洞提权,linux下的mysql system提权以及oracle低权限提权
5)日志清理
6)总结报告及修复方案 !!!(重点去看看这一篇文章)
如何写好一份“漏洞报告” - FreeBuf网络安全行业门户
绕过cdn的方法!
DDOS(多了解)
DDOS攻击系列:SYNflood,ACKFLOOD,UDPFLOOD,CC攻击等原理防御手段
序列化
序列化:把对象转化为可传输的字节序列过程称为序列化。
反序列化:把字节序列还原为对象的过程称为反序列化。
重点看php反序列化与java反序列化
应急响应与安全加固
五个流程:
信息收集 :收集客户信息和中毒主机信息,包括样本,
判断类型:判断是否是安全事件,何种安全事件,勒索,挖矿,断网,dos等。
深入分析 :日志分析,进程分析,启动项分析,样本分析
清理处置:直接杀掉进程,删除文件,打补丁,或者修复文件
产出报告:整理并并输出完整的安全事件报告
应急工具类型
流量分析工具 wireshark ,tcpview ,linux下的tcpdump
进程分析工具 processhacker ,pc Hunter
启动项分析工具 autoRuns
专杀工具 :
辅助工具 :winhex,文件hash工具,everything搜索工具,
内存扫描工具,memscanner
常见勒索病毒,挖矿病毒等
/参考于深信服千里目实验室/
异常处理思路
了解哪些病毒 受到勒索病毒威胁怎么处理 (.事件状态判断
了解现状,了解发病时间,了解系统架构,然后确认被感染主机范围!
2.临时处置
已感染主机:进行网络隔离,禁止使用U盘、移动银盘等移动存储设备
未感染主机:ACL隔离、关闭ssh、rdp等协议,禁止使用U盘、移动硬盘。
3.信息收集分析
windows:
A.文件排查:
msconfig查看启动项
%UserProfile%\Recent查看最近使用的的文档
B.进程排查
netstat -ano查看网络连接、定位可疑的ESTABLISHED
tasklist | findstr 1228 根据netstat定位出的pid,在通过tasklist进行进程定位
wmic process | findstr “vmvare-hostd.exe” 获取进程全路径
C.系统信息排查
查看环境变量设置
windows计划任务(程序-附件-系统工具-任务计划程序)
windows账号信息,如隐藏账号等(compmgmt.msc)用户名以$结尾的为隐藏用户
查看当前系统用户的会话query user,logoff踢出该用户
查看systeminfo信息,系统版本以及补丁信息
工具排查
PC Hunter 信息信息查看
ProcessExplorer 系统和应用程序监视够工具
Network Monitor 网络协议分析
日志排查(计算机管理-事件查看器 eventvwr)
日志类型:
应用程序日志(应用程序日常使用记录)
系统安全日志(谁,使用什么权限、干了什么事)
setup:软件安装、更新安装
系统日志:组策略更改等系统敏感操作
forwarded-Events:暂无日志信息
主要分析安全日志,借助自带的筛选和查找功能,将帅选日志导出使用notepad++打开
使用正则去匹配远程登录过的IP地址
((??:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))).){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))
linux
A.文件排查
使用stat命令:
access time访问时间
modify time内容修改时间(黑客通过菜刀类工具改变的是修改时间,所以如果修改时间在创建时间之前明显是可以文件)
change time属性改变时间
1.敏感目录文件分析[类/tmp目录、命令目录/usr/bin、/usr/sbin]
ls -a 查看隐藏文件和目录
2.查看tmp目录下的文件 ls -alt /tmp [-t 按更改时间排序]
3.查看看机启动项 ls -alt /etc/init.d ,/etc/init.d是/etc/rc.d/init.d的软链接
4.按时间排序查看指定目录下的文件 ls -alt | head -n 10
5.查看历史命令记录文件 cat /root/.bash_history | more
6.查看操作系统用户信息文件/etc/passwd
root❌0:0:root:/root:/bin/bash
[用户名:口令:用户标识:组标识:注释性描述:主目录:登录shell]
7.查找新增文件
查找24小时内被修改的php文件find ./ -mtime 0 -name “*.php”
查找72小时内新增的文件 find / -ctime 2
-mtime -n +n 按更改时间查找 -n n天以内 +n n天以前
-atime -n +n 按访问时间查找 -n n天以内 +n n天以前
-ctime -n +n 按创建时间查找 -n n天以内 +n n天以前
8.特殊权限文件查看
查找777权限的文件 find / *.php -perm 4777
9.隐藏的文件 ls -ar | grep “^.”
10.查看分析任务计划 crontab -u <-l、-r、-e>
-u 指定用户 -l 列出某用户任务计划 -r 删除任务
-e 编辑某个用户的任务(也可以直接修改/etc/crontab文件)
B.进程排查
1.使用netstat -anptl/-pantu | more 查看网络连接状况
2.根据netstat 定位出的可疑pid,使用ps命令、分析进程
ps aux | grep pid | grep -v grep
C.日志排查
1.查看系统用户登录信息
lastlog,查看系统中所有用户最近一次登录的信息
lastb,显示用户错误的登录列表
last,显示用户最近登录信息。
D.事件处置
已感染主机:进行断网隔离、等待解密进展、重装系统
未感染主机:
补丁修复(在线补丁、离线补丁)
事件加固:安装防护软件(开启实时防护、及时更新病毒库)
E.事件防御
预防:定期打补丁、口令策略加固
监控:部署杀毒软件、部署流量监测设备)
常见项
GET和POST的区别
get方法没有请求内容 post是有请求内容,post请求最多用于向服务器发送大量的数据,get虽然也能发送数据,但是有大小长度的限制。并且get请求会将发送的数据显示在游览器端,而post不会,所以安全性相对来说高一点。
常见的状态码
1xx 信息提示,表示请求已被成功接收
2xx 成功,服务器成功地处理了请求
3xx 重定向
4xx 客户端错误状态码
5xx 服务器自身出错or服务器允许出错了
http和https的区别
http是超文本传输协议,信息是明文传输,https是具有安全性的ssl加密传输协议、
http是80端口连接 ,https是443端口
https协议需要到ca申请证书,而http协议不需要
http连接相对简单,是无状态的,而https协议是有ssl+http协议构建的可进行加密传输,身份认证的网络协议,相对来说,它比http协议要安全。
session和cookie
session与cookie最大的区别在与cookie是将数据存储在客户端,而session是存储在服务器端,仅仅是在客户端存储一个id。相对来说,session比cookie安全
TCP和UDP的区别
tcp是面向连接的,udp是无连接的
tcp具有可靠性,udp不可靠
tcp是有序的,udp不保证有序
tcp传输的慢,udp传输的快
tcp 有拥塞控制或流量控制,udp没有
http和tcp的区别
HTTP协议是建立在TCP协议之上的一种应用。
简单的说,TCP就是单纯建立连接,不涉及任何我们需要请求的实际数据,简单的传输。http是用来收发数据,即实际应用上来的。
TCP是底层通讯协议,定义的是数据传输和连接方式的规范;
HTTP是应用层协议,定义的是传输数据的内容的规范;
HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP ;
HTTP支持的是www服务 ;
而TCP/IP是协议, 是Internet国际互联网络的基础,是网络中使用的基本的通信协议。
TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。
同源策略
浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。
正向代理和反向代理
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
缓冲区溢出
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。
但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。
操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。
dns解析
A记录:将域名指向一个IPv4地址(例如:10.10.10.10)。
CNAME记录:如果将域名指向一个域名,实现与被指向域名相同的访问效果。
MX记录:建立电子邮箱服务,将指向邮件服务器地址。
NS记录:域名解析服务器记录,如果要将子域名指定某个域名服务器来解析。
TXT记录:可任意填写(可为空),通常用做SPF记录(反垃圾邮件)使用。
AAAA记录:将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1)。
SRV记录:记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)。
显性URL:将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址(例如:将www.tianidc.cn显性转发到www.ibadboy.net后,访问www.tianidc.cn时,地址栏显示的地址为:www.ibadboy.net)。
隐性URL:与显性URL类似,但隐性转发会隐藏真实的目标地址(例如:将www.tianidc.cn隐性转发到www.ibadboy.net后,访问www.tianidc.cn时,地址栏显示的地址仍然为:www.tianidc.cn)。
安全评估4个阶段:资产等级划分、威胁分析、风险分析,确认解决方案。
对称加密:DES 3DES,IDEA,RC5,6,AES
非对称加密:RSA,ECC,DSA
网络知识
TCP三次握手(为什么是三次)
四次挥手
ssl加密
dns解析过程
tcp/ip协议
http协议(包含哪些内容)
nat
ftps
ospf与rip的区别
google hack语法
Linux、windows
查看分析日志,端口,进程,计划任务,文件管理,版本等
推荐《鸟哥的私房菜》这本书
工具
nmap,bp,sqlmap,wireshark等工具的使用,参数多熟悉,多实践。
内网安全
隧道技术
黄金票据和白银票据
寻找域控主机的IP等等
OWASP TOP10
每一年的都不相同,可以去官网查看,熟悉 复现
端口
端口的漏洞比如像3389,445等等这些端口的作用以及所存在的漏洞,怎么去利用
项目内容
自己做的项目一定要熟练,能够达到随问随答。
安全产品
一些常见的安全产品,waf,动态感知都要有了解熟悉