第 5 天
· 阅读需 4 分钟
- 国内 fofa 通过定期爬取全球 IPv4 地址, 检测出漏洞
Wappalyzer识别服务指纹
端口扫描
Nmap
- -sn, 只 ping 不扫描
- -Pn, 跳过 ping 直接扫描
- -sS, 发 TCP SYN 包扫描
- -p, 扫描指定端口, Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
- -sV, 嗅探服务和版本信息
- -O, 检测操作系统
- -iL <文件名>, 读取目标文件
- -d, 显示扫描过程
- --open, 只显示开放的端口
Exp: 扫描目标 ip 所有端口和服务指纹
docker run --rm uzyexe/nmap -Pn -p1-65535 --open -sV 124.221.131.194 -d

Zenmap

SQL 注入
测试修改 sql 语句能否改变原执行逻辑, 与正常输入返回结果不一致则存在 sql 注入漏洞
数字型注入
id=1 and 1=2
- 测试正确的字段数量, 通过
select后尝试多个字段判断支持接收几个字段参数
id=-1 union select 1,2 from mysql.user
- 拼接
union语句, 通过information_schema库的columns表查询mysql下所有数据库/表/字段, 查询字段数与上面尝试成功数量一致
id=-1 union select null,concat(table_schema,',',table_name,',',column_name) from information_schema.columns

- 通过上面查询的字段获取用户名/密码

- 复制网页源码创建
.html文件在浏览器打开

- 拷贝 md5 密文通过
https://www.cmd5.com/网站解密

字符串型注入
通过 ' 或 " 提前闭合字符串, 并注释掉原字符串后面内容
name='1' or 1=2 -- a'
报错注入
函数传入构造的参数, 会将参数执行结果以报错形式打印出来
盲注
返回布尔结果
通过逐个比较判断数据的长度
length()
通过数据 ASCII 码值二分查找出对应的字母数字
ascii(substr(,,)) > 97
延时
通过条件分支匹配执行延时, 找出对应的字母数字或数据长度
HTTP 报文头部注入
源码中读取 HTTP 报文头字段并由 SQL 处理时, 可注入 报文头字段构造字符串型注入, 然后重放
二次注入
插入带有 ' 的脏数据, 脏数据被再次调用时生效
GetShell
满足三个条件:
- 知晓当前数据库的绝对路径
- 配置文件my.ini中
secure_file_pre为空 - 当前用户有数据库所在目录的写权限
union select into "/var/lib/mysql/data/"
常用变量及函数
全局变量
@@basedir 当前数据库的绝对路径
绕过防注入
位宽注入
GBK 编码下, %df\ 会被解析成汉字, 依次绕过程序对 ' 的转义
id='1%df' or 1=2 -- a'
注释绕过
只有特定版本的 MySQL 会执行 /*! */ 中的内容