java代码审计

java编译篇 java编译过程: Java源代码 ——(编译)——> Java字节码 ——(解释器)——> 机器码 Java源代码 ——(编译器 )——> jvm可执行的Java字节码 ——(jvm解释器) ——> 机器可执行的二进制机器码 ——>程序运行 采用字节码的好处:高效、可移植性高 以下示例为.java文件: 以下是.class文件: 反编译工具篇 fernflower jad jd-gui idea自带插件 jar包本质上是将所有class文件、资源文件压缩打成一个包。 Servlet与jsp篇 Servlet: 类似小程序,处理较复杂的服务端业务逻辑 含有HttpServlet类,可进行重写 servlet3.0后使用注解方式描述servlet,使用doGet和doPost为默认命名 servlet3.0版本之前必须在web.中配置 jsp: 会被编译成一个java类文件,如index.jsp在Tomcat中Jasper编译后会生成index_jsp.java和index_jsp.class两个文件。是特殊的servlet。 全局控制器篇 使用idea,全局搜索command+shift+f(或者a) find ~/cms/ -type f -name "*.class" |xargs grep -E "Controller|@RestController|RepositoryRestController" find ~/cms/ -type f -name "*.class" |xargs grep -E "RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping|RepositoryRestResource" 全局过滤器篇 审计时,得先看是否含有全局过滤器。切勿看到Servlet、JSP中的漏洞点就妄下定论,Servlet前面很有可能存在一个全局安全过滤的Filter。当然每种框架的写法也有差别。个人认为Filter主要是用在 web.全局过滤 Y 阅读全文 箭头
8个评论-3683个浏览
收藏 收藏

Marginwidth/marginheight – 意想不到的跨源通信通道

2020年7月6日,我在Twitter上宣布了XSS挑战,到目前为止,只有四个人能够解决它,每个人都告诉我他们以前从未听说过挑战中使用这种"奇特"的方式,因此,这里有一篇文章解释了这个"奇特"以及一些背景故事。 挑战的核心在于以下几行JavaScript: document.addEventListener("DOMContentLoaded" () => { for (let attr of document.body.attributes) { eval(attr.value); } }); 该代码仅对元素的所有属性进行迭代,并将所有这些属性的值作为JavaScript执行。由于挑战中没有其他源,这意味着要解决该问题,需要找到一种方法来将任意属性值注入document.body。那怎么可能呢? 当我注意到HTML规范中一个有趣的代码片段时,一切就开始了。规范的第14部分称为“渲染”,介绍了某些元素的默认样式。例如,它说or 元素默认情况下不显示(即 display:none)。有趣的是的边距是如何确定的? 该表表示,如果标签拥有一个名为marginheight的属性,那么它将映射到该元素的CSS属性——margin-top上。如果不存在该属性,则检查topmargin属性。如果也不存在,那么(接下来就很有意思了),如果当前页面位于嵌套的浏览器上下文(就是说在或)中,浏览器将使用容器元素的marginwidth属性。这种现象在跨域的时候也一样,这是规范中直接允许的: 起初,我认为这是一个历史遗留问题,并且没有哪个现代浏览器实际以这种方式实现它。 浏览器行为 为了测试浏览器的行为,我有一个简单的代码,可让我检查是否考虑了该marginwidth属性。 Chromium 在Chromium中,该marginwidth属性反映在元素中,但在赋值之前已被强制转换为整数。有趣的是Chromium会监听此值的更改,因此,如果您动态更改它,它也会反映在i中。这是一个例子: i input { width:400px; } Firefox 在Firefox中,的值根 阅读全文 箭头
8个评论-3797个浏览
收藏 收藏

缓冲区溢出的入门介绍

缓冲区溢出漏洞概念:在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据,缓冲区溢出是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序的堆栈,使程序转而执行其他指令,以达到攻击的目的。缓冲区溢出漏洞产生原理:官话有点多,下面简单介绍一下缓冲区溢出漏洞是如何发生的。以下是对C语言中缓冲区溢出漏洞的理解,因为C语言中并没有对数组和指针的引用进行检查,所以在平时的程序运行时缓冲区溢出漏洞更容易出现。例子:#includevoid main(){chara [10];gets(a);}这个程序中若输入的字符数不超过10个,像helloworld,则运行正常,若输入的是helloworld则程序发生溢出。因为程序只申请了10个字符,而输入的字符超过了这个数目,这时,多余的字符将会占用不属于自己的内存空间。由于C语言并不会进行边界检查,所以程序看似运行正常。如果被占用的内存本来就是空的,或者不重要。那么程序也会正常运行,如果是重要的信息,将会造成严重后果。在实际的运行过程中缓冲区溢出又分为堆溢出和栈溢出。堆溢出:堆溢出的原理是覆盖其他重要的数据以达到目的。但是实现比较困难:首先要确定那个变量是重要的变量,其次要知道比目标变量低的溢出点的内存位置,最后重要的变量被覆盖后程序还能继续运行下去。栈溢出:栈溢出的原理是覆盖函数的返回地。函数调用过程中,函数的返回地址保存在栈里面。所以栈溢出的思路就是把栈里面的返回地址覆盖,然后替换成攻击者想要的地址。因为栈是往下增加的,先进入栈的地址反而要大,这种机制更方便的提供了漏洞产生的可能性。缓冲区溢出的危害:缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动,或者执行攻击者的指令,比如非法提升权限。缓冲区漏洞对应函数:C/C++语言中像strcpy函数还有strcat()、sprintf()、vsprintf()、gets()、scanf() 以及在循环内的getc()、fgetc()、getchar()等这些常见的 阅读全文 箭头
7个评论-4100个浏览
收藏 收藏

自写渗透工具之shell工具编写(python篇)

前几天写了个c反弹shell的工具,实在是无奈,c被杀的太狠了,看一张图就明白了 忽然想起来,用python写效果可能会更好,说干就干。 知识储备 编写反弹shell,我们首先要明白简单的通信原理。 在python里面实现通信,我们需要一个socket库。 我们可以使用下面的方法轻易的实现一个能够通信的服务端、客户端 import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',2333)) phone.listen() phone.accept() import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',2333)) 除了这些之外,还有一些常用的函数用来实现通信: recv() #接受TCP数据 send() #发送TCP数据 recvfrom() #接受UDP数据 sendto() #发送UDP数据 getpeername() #接收到当前套接字远端的地址 getsockname() #返回指定套接字的参数 setsockopt() #设置指定套接字的参数 close() #关闭套接字 了解了通信模块之后,我们还需要一个subprocess子进程模块,因为我们的目的不是通信,而是将我们发送的命令进行执行,并返回给我们,而subprocess子进程模块就可以实现我们的需求。这个模块本身是为了代替一些老的模块而来的,所以使用起来很方便。 import subprocess #Popen方法是用来执行系统命令的,直接把结果打印到终端了 res =subprocess.Popen(r'dir',shell=True, #r'dsfsdfr',shell=True, # stdin= #标准输入(不常用) stdout=subprocess.PIPE,#stdou 阅读全文 箭头
5个评论-3591个浏览
收藏 收藏
更多

加载中,请稍候

请求超时,点击重新加载

提问
写文章

装饰 推荐专栏

换一换

网络安全人物
app漏洞
永信至诚
物联网趋势

装饰 权威推荐

广东省应急响应平台
广东网警
广东省计算机信息网络安全协会
专栏
小密圈

装饰 安全达人

换一换

读芯术
TaoZi
taype
霸气的老鼠
master-slave
诚心的咖啡
可爱的棒球
迷路的画板