知道创宇面试笔记

  • 自我介绍一下

  • 你最擅长的漏洞是那些?描述一下你做CTF印象最深的一道题?

  • SQL注入绕waf的姿势?

    • 注释符绕过 //、 – 、 /**/ 、#、 –+、 – -、 ; 、%00、–a
    • 大小写绕过
    • 双关键字绕过
    • 内联注释 /!/在其他数据库语言中是注释,但是在sql中却可以执行,为了sql提高语句的兼容性
    • 空格绕过 %20 %09 %0a %0b %0c %0d %a0 /**/
    • 换行符绕过 %0a %0d
    • 截断绕过 %00 %80-%99
    • 宽字节绕过 GBK编码
  • mysql时间盲注一般都怎么注?

    • 最简单的就是sleep了,用if(1=1,sleep(5),0)

    • benchmark函数

    • heavy query 笛卡尔积 —->具体的方式就是将简单的表查询不断的叠加,使之以指数倍运算量的速度增长,不断增加系统执行 sql 语句的负荷,直到产生攻击者想要的时间延迟

    • get_lock GET_LOCK有两个参数,一个是key,表示要加锁的字段,另一个是加锁失败后的等待时间(s),一个客户端对某个字段加锁以后另一个客户端再想对这个字段加锁就会失败,然后就会等待设定好的时间

      1
      2
      select * from ctf where flag = 1 and 1 and get_lock('username',5);
      select * from ctf where flag = 1 and 0 and get_lock('username',5);
  • sql注入过滤了逗号,怎么弄?

    • 可以用join

      1
      select id,ip from client_ip where 1>2  union select * from  ((select user())a JOIN  (select version())b);
    • 可以用from 1 for 1这样

    • select case where 条件1 then 条件2 else 条件3 end;

      1
      select case when 1=1 then sleep(2) else 0 end;
    • offset

      1
      slect * from student limit 4 offset 9
  • mysql-udf提权有了解过吗?

    • udf提权呗,这里就不说了。
  • 如何利用sql注入getshell?

    • 直接写马打web路径
  • 如果有文件包含的话,通过日志的形式去getshell

  • 利用sql注入getshell需要具备什么条件?

    • 知道web路径(通过报错来写)
  • 有权限写

  • 反序列化有了解过吗?阐述一下原理?php、java、python的都说一说?

    php反序列化主要通过unserialize()函数、phar协议去触发,主要利用到的就是一堆魔术方法,如果魔术方法里面有一些代码没写好,我们就可以利用反序列化去写马getshell、直接RCE等很多操作,具体要看情况而定。

    1、首先魔术方法一般包括

    1
    2
    3
    4
    5
    6
    7
    8
    9
    __construct()//创建对象时触发
    __destruct() //对象被销毁时触发
    __call() //在对象上下文中调用不可访问的方法时触发
    __callStatic() //在静态上下文中调用不可访问的方法时触发
    __get() //用于从不可访问的属性读取数据
    __set() //用于将数据写入不可访问的属性
    __isset() //在不可访问的属性上调用isset()或empty()触发
    __unset() //在不可访问的属性上使用unset()时触发
    __invoke() //当脚本尝试将对象调用为函数时触发

    2、讲一个CVE-2016-7124

    这个CVE-2016-7124漏洞,当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

    3、php的session反序列化漏洞

    首先php的session存储与读取是一个序列化跟反序列化的过程,其中有三种模式,分别是php_binary、php、php_serialize,这几个模式的存储方式不太一样,这也是会导致反序列化漏洞的根源。

    比如说是php_serialize的存储方式,那么我们可以通过构造一个上传表单,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在$_SESSION中获得。 当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据, 索引是 session.upload_progress.prefix 与 session.upload_progress.name连接在一起的值。然后再session_start()函数,直接触发session反序列化漏洞。

    4、怎么找POP链

    ​ (1)寻找 unserialize() 函数的参数是否有我们的可控点

    ​ (2)寻找我们的反序列化的目标,重点寻找 存在 wakeup() 或 destruct() 魔法函数的类

    ​ (3)一层一层地研究该类在魔法方法中使用的属性和属性调用的方法,看看是否有可控的属性能实现在当前调用的过程中触发的

    5、利用phar增加攻击面

    hitcon Orange 的一道 0day 题的解法,打开了反序列化的大门,之后再black 2018有一位演讲者也谈到了phar协议在反序列化中的运用,大大增加了攻击面。

    • phar 文件包在 生成时会以序列化的形式存储用户自定义的 meta-data ,配合 phar:// 我们就能在文件系统函数 file_exists() is_dir() 等参数可控的情况下实现自动的反序列化操作,于是我们就能通过构造精心设计的 phar 包在没有 unserailize() 的情况下实现反序列化攻击,从而将 PHP 反序列化漏洞的触发条件大大拓宽了,降低了我们 PHP 反序列化的攻击起点。
    • 演讲中测试发现php中很多很多函数配合phar协议,可以触发反序列化漏洞。比如说file_get_contents、file_exists、还有最新的SUCTF遇到的finfo_file等等。这里提一下,含可以通过php://filter/resource=伪协议的形式后面跟phar协议,同样可以触发。这是在SUCTF做题中最新发现的一个点。
    • 利用条件: 存在文件上传点,还有操作系统文件的函数。
    • 跟进phar源码,其实最根源的是底层调用了php_stream_open_warpper_ex函数处理。

    Python 的序列化和反序列化是将一个类对象向字节流转化从而进行存储和传输,然后使用的时候再将字节流转化回原始的对象的一个过程。当然了,这里的底层是一个叫PVM的东西在处理,简单理解就是一个栈,结合一些指令码来序列化数据跟反序列化一些数据

    1、最经典的莫过于flask配合redis在服务端存储session场景,这里的session是被pickle序列化存储的,如果你通过cookie进行sessionid的话,session中的内容就会被反序列化,这里需要提到的就是redis未授权了。危害可想而知。

    2、python反序列化的利用

    这里就必须提到__reduce__这个方法了,在python的序列化中,可以通过类中定义的__reduce__方法来告知如何进行序列化或者反序列化,关键就在这个方法的返回值上,这个方法可以返回两种类型的值,String 和 tuple ,我们的构造点就在令其返回 tuple 的时候,当他返回值是一个元祖的时候,可以提供2到5个参数,我们重点利用的是前两个,第一个参数是一个callable object(可调用的对象),第二个参数可以是一个元祖为这个可调用对象提供必要的参数,这里说一下,如果我们要序列化一个函数对象的话,pickle库是不能帮你完成的,因为这里并不是什么对象都能被序列化,python不能序列化代码对象的,然鹅并非绝路,python给我们提供了一个可以序列化代码对象的模块Marshal。上面也提到了是序列化类,我们这里要序列化的就是一个函数,这里可以通过python动态创建匿名函数的方法,具体构造方法,网上已经有对应的代码。大体就说这么多吧。

    java序列化的话,代码层面没有怎么细究过,Java 反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject() 方法用于反序列化。最出名的莫过于15年的Apache Commons Collections 反序列化远程命令执行漏洞。具体详情虽然有跟过一次,具体问题出在org.apache.commons.collections.Transformer 接口上;在 Apache Commons Collections 中有一个 InvokerTransformer 类实现了 Transformer,主要作用是调用 Java 的反射机制(反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,详细内容请参考:http://ifeve.com/java-reflection/) 来调用任意函数,只需要传入方法名、参数类型和参数,即可调用任意函数。TransformedMap 配合sun.reflect.annotation.AnnotationInvocationHandler 中的 readObject(),可以触发漏洞。

  • 有跟过最近的一些最近的漏洞吗?

    之前1月份大火的thinkphp5.xRCE漏洞,具体问题就是路由解析的时候,取得$_POST[‘_method’]的值并将其赋值给$this->method,然后动态调用$this->{$this->method}($_POST)。这意味着攻击者可以调用该类任意函数并以$_POST作为第一个参数。如果动态调用__construct函数,则会导致代码执行。由于$options参数可控,攻击者可以覆盖该类的filter属性、method属性以及get属性的值。

    具体参考: thinkphp-RCE漏洞分析

  • 有代码审计的经验吗?

    打CTF,代码审计题当然做了不少。

  • 了解过CSP吗?说一说绕过方式?

    这个问题本来是可以回答的很多的,由于当时面试接近尾声,头脑有点累了,我当时啥都没说,我说好久之前记录了很多绕过姿势在我的博客上,这个问题没回答上,挺遗憾的。这里也直接放我博客吧CSP-And-CSP-Bypass

    CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

    当然绕过姿势也很多。

    1、首先的话就是利用跳转,可以利用meta标签

    2、如果script-src的模式unsafe-inline 和 unsafe-eval,如果过滤了很多关键字,可以通过String.fromCharCode加eval的姿势绕过。

    3、标签预加载<link rel=”prefetch”>,dns预解析。

    4、利用浏览器的补全,比如说使用<script>标签的nonce属性,只有nonce一致的脚本才生效

    5、利用文件上传js。具体在RCTF有一道题,这里就不说了,而且当时也有利用跳转非预期的,预期就是利用service-worker。

    6、通过base标签,改变资源加载的域

    太多了orz。姿势骚得很。

  • 了解过CORS吗?它跟jsonp的区别?

    说到CORS,当然得先说同源策略了。简单就是同域名、同端口、同协议。CORS简单来说,就是服务器只需要合理设置Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Access-Control-Expose-Headers三个字段,客户端请求时加入Origin:字段,服务端判断该Origin是否在Access-Control-Allow-Origin规则中,若满足规则,则能成功请求数据。

    不过配置CORS往往经常会出现配置错误:

    1、反射origin头

    ​ 根据前面的 CORS基本用法,开发者可以很容易实现与其它单个网站共享数据。假如一个开发者想要与多个网站共享数据,应该如何配置CORS呢?也许直觉告诉你应该如下配置:

    1
    Access-Control-Allow-Origin: http://a.com, http://c.com

    但事实上这两种域名配置是错误的,因为CORS标准规定,Access-Control-Allow-Origin只能配置为单个origin, null或*。如果开发者想要实现同时与多个域名共享域名的需求,则需要专门编写代码或者使用框架来协助动态生成访问控制策略。这种动态生成的做法增加了开发者配置难度,导致实际网络中出现各种不安全的误配置。

    2、origin校验错误

    * 前缀匹配
    * 后缀匹配
    * 没有转义'.'
    * 包含匹配

    3、https域信任HTTP域

    HTTPS协议被设计用于在不安全的中间网络中进行安全通信。即使在中间人网络环境下,攻击者也应该无法读取HTTPS网站的内容。但是如果该HTTPS网站配置了CORS且信任HTTP域,那么中间人攻击者可以先劫持受信任HTTP域,然后通过这个域发送跨域请求到HTTPS网站,间接读取HTTPS域下的受保护内容。具体流程如图3所示,中间人攻击者可以可以利用 http://example.com 网站为跳板,窃取 HTTPS 网站的内容。

    4、信任自身全部子域

    但是如果这个域配置了CORS且信任全部子域,那么攻击者可以利用其他任意子域上XSS漏洞,发送跨域请求到目标重要域网站,从而获取敏感内容。

    jsonp跟cors的区别

    jsonp是jquery提供的跨域方式
    cors是w3c提供的一个跨域标准
    ——————————————————————
    jsonp只支持get方式的跨域
    cors支持get和post方式的跨域
    ——————————————————————
    jsonp支持所有的浏览器(因为所有浏览器都可以使用script标签发送请求)
    cors不支持IE10以下的浏览器
    ——————————————————————

  • 如果使XSS攻击最大化?

    1、比如说利用xss添加管理员,让管理员点一下即可,具体参考wordpress和Drupal框架。

    2、比如说做键盘记录,无限获取用户账号密码

    3、xss+ssrf+redis getshell

    4、做一些权限控制操作。

  • 了解过Rootkit XSS吗?

    一种XSS权限维持,利用的漏洞根源是GPC注册全局变量的顺序不通,通过GP注册变量最后能被C覆盖,而cookie是客户端浏览器的持久化数据,如果通过XSS漏洞设置cookie,我们完全可以把这个典型的非持久型XSS漏洞变成持久的。

    实战Dedecms后台登录主页存在一个Rootkit XSS

    <input type=”hidden” name=”gotopage” value=”<?php if(!empty($gotopage)) echo $gotopage;?>” />

    DEDECMS核心代码中,模拟全局变量注册机制的顺序是GPC,也就是C能够覆盖GP所注册的变量。
    可以在cookie中持久化保存gotopage变量,如果管理员触发过我们的XSS漏洞,我们就能在管理员的cookie中持久化保存gotopage变量,将gotopage隐藏表单值变为我们的任意脚本内容,以后管理员只要是访问后台页面都会触发XSS漏洞,我们完全可以劫持管理员的整个登陆过程,悄无声息的直接获取管理员的密码。

  • 怎么利用XSS权限维持?

    这个问题在XSS攻击最大化中也算有提到一些权限控制,Rootkit XSS也算,这里就不在提了

  • 文件上传你能想到绕过的姿势?

    ​ 这个直接照着upload-labs的脑图讲就行

    ​ 这里简单的说一下就是:

    ​ php3,php4,php5,phtml等这样的后缀

    ​ 如果可以上传.htaccess、.user.ini

    ​ 后缀大小写绕过

    ​ 截断

    ​ 配合解析漏洞

    ​ 双关键字

    ​ 图片马

    ​ 还有更多的代码层面的上传逻辑洞

  • 了解PHP5跟PHP7的差异吗?具体可以说说看?

    1、Null合并运算符

    1
    2
    3
    4
    //Before PHP7:
    $id = isset($_GET[‘id’]) ? $_GET[‘id’] : null;
    //In PHP7:
    $id = $_GET[‘id’] ?? null; //equivalent of writing old above syntax

    2、CSPRNG(伪随机数产生器)。

    PHP 7 通过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。

    1
    2
    random_bytes() - 加密生存被保护的伪随机字符串。
    random_int() - 加密生存被保护的伪随机整数。

    3、返回类型声明

    PHP 7增加了对返回类型声明的支持 。与参数类型声明类似 ,返回类型声明指定将从函数返回的值的类型。 返回类型声明可以使用相同的 类型,可用于参数类型声明。

    4、define定义数组常量

    php7支持用define函数定义数组常量

    5、反序列化的过滤

    加一个可选白名单参数

    6、PHP 7 移除的扩展

    1
    2
    3
    4
    ereg
    mssql
    mysql
    sybase_ct

    7、php7取消了preg_replace () 的/e修饰符,

    取而代之用的是preg_replace_callback()

    8、assert() 默认不在可以执行代码

    9、session_start() 可以加入一个数组覆盖 php.ini 的配置

    10、扯皮: 性能提升呗

    可以继续补充

  • 怎么判断是windows还是linux?

    最简单就是windows对大小写不敏感,linux对大小写敏感

    还有就是看中间件,通过路径报错什么的都可以看出来。

  • 描述一下你在漏洞挖掘遇到的逻辑漏洞?

    1、验证码漏洞

    • 爆破
    • 验证码复用
    • 验证码在前端验证

    2、支付漏洞

    • 直接抓包修改金额
    • 购买数量进行负数限制
    • 越权支付

    3、任意密码重置

    • 没有对验证码做限制错误次数,无限爆破
    • 攻击者修改A用户密码,填入手机号码,收到验证码,但是不填,此时再申请重置B的密码,填写一样的手机号码,把刚刚收到的验证么填进去,有可能重置用户B的密码
  • 了解过原型链污染吗?

    1、所有的对象都有proto属性,该属性对应该对象的原型.
    2、所有的函数(也只有函数才有)对象都有prototype属性,该属性的值会被赋值给该函数创建的对象的_proto_属性.
    3、所有的原型对象都有constructor属性,该属性对应创建所有指向该原型的实例的构造函数.
    4、函数对象和原型对象通过prototype和constructor属性进行相互关联.

    每个对象获取属性的时候首先会看看自己有没有,如果没有,就去原型上面找,原型上面还没有,会继续往原型的原型上找,这里就给我们带来了污染某对象的原型,导致绕过。

    具体参考: javascript原型链污染详解(后有彩蛋)

  • 了解过SSRF吗?一般是有过滤的,绕过方式有哪些?如果有一个SSRF你能做一些什么?

    SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。

    可能出现的地方:

    1、社交分享功能:获取超链接的标题等内容进行显示

    2、转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

    3、在线翻译:给网址翻译对应网页的内容

    4、图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

    一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……

    绕过技巧:

    1、@符

    2、各种IP地址的进制转换

    3、跳转

    4、短地址

    5、特殊域名 xxxx.xip.io

    6、DNS解析(比较苛刻),如DNS重绑定

    7、[::]

    8、利用。

    9、利用curl跟parse_url函数的差异绕过

    做些什么?

    1、内网、本地端口扫描,获取开放端口信息

    2、主机信息收集,web应用指纹识别,获取服务banner信息

    3、根据识别出的应用针对性的发送payload攻击,例如struts2
    4、攻击内网和本地的应用程序及服务。
    5、穿越防火墙
    6、利用file协议读取本地文件,比如file:///etc/passwd

    等等。

  • 了解过websocket吗?

    它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

    其他特点包括:

    (1)建立在 TCP 协议之上,服务器端的实现比较容易。

    (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

    (3)数据格式比较轻量,性能开销小,通信高效。

    (4)可以发送文本,也可以发送二进制数据。

    (5)没有同源限制,客户端可以与任意服务器通信。

    (6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

总结

上面没有回答的题目一个是websocket,因为了解不深,只知道是可以双向推送信息,所以不太敢细谈,还有就是Rootkit XSS在CTF跟挖洞都没有怎么用到过,也没怎么回答上,其他的话马马虎虎吧,总结第一次面试还是挺顺利的,不过还是自认为自己的知识面太窄了,还是要继续学习,每一个知识点需要继续学深。

小惊喜

面试还没缓过来,10分钟不到hr就打电话过来了,叫我准备材料23333

-------------本文结束感谢您的阅读-------------