DVWA靶场部分关卡总结

暴力破解

Attack type:攻击模式设置

Sniper:对变量一次进行破解,多个标记依次进行。(俗话简单来说就是,用户名和密码用的是一套字典,破解的时候也只是导入一个字典,但是它会根据先破解用户名,破解出来以后急需破解密码这样的顺序,对于简单的用户名密码字典数目少的可以考虑)将一组攻击载荷分别在每一个位詈上逐个放入单个payload测试,比如字典里有五个payload,在请求模板上定义了两个payload位置,在修改时会把这五个payload分别放入第一个位置,再分别放入第二个位置,最后产生十个版本的请求

Battering ram:对变量同时进行破解,多个标记同时进行。遍历一组有效载荷,在所有定义的位置上放入同一个载荷。同样是五个payload,两个位置,那一共会有五个版本的修改请求,每个版本的请求的两个位置上是同样的payload。(这个也是只有一个字典但区别是,可以同时进行,就是先破解用户名破解完了继续破解密码,相比遇上一个速度更快)

Pitchfork:每一个变量标记对应一个字典,取每个字典的对应项。(这个意思就是,每个变量一个字典,破解的时候每个字典的一号对应另一个字典的一号进行破解,这样破解对于那些一一对应的用户名密码来说速度很快,但很明显我们没办法准确的定位用户名和密码,显然不适用于每个情况)

Cluster bomb:每个变量对应一个字典,并且进行交际破解,尝试各种组合,适合于用户名加密码破解。(这种情况就是普罗大众很容易明白理解的情况就是多个字典进行笛卡尔积,依次破解,这种就会有多种组合,时间上也是一个问题,当然对于需要用时很长的,我们可以添加进程,用来适量缩短时间)

选择好攻击模式之后,开始导入字典,burp本身会携带字典,但更多的时候是利用我们自己找的字典进行爆破。

high

这一关与之前的区别主要在于token

Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

什么是 Cookie

  • HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现。
  • cookie 存储在客户端: cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
  • cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的靠的是 domain)

cookie 重要的属性

Session

session是存储于服务器端的特殊对象,服务器会为每一个游览器(客户端)创建一个唯一的session。这个session是服务器端共享,每个游览器(客户端)独享的。我们可以在session存储数据,实现数据共享。session类似于一个Map,里面可以存放多个键值对,是以key-value进行存放的。key必须是一个字符串,value是一个对象。session是每一个游览器(客户端)所唯一的,这个是怎么实现的呢?其实,在访问一个网站时,在HTTP请求中往往会携带一个cookie,这个cookie的名字是JSESSIONID,这个JSESSIONID表示的就是session的id,这个是由服务器创建的,并且是唯一的。服务器在使用session时,会根据JSESSIONID来进行不同操作。

Cookie 和 Session 的区别

  • 安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
  • 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
  • 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
  • 存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。

什么是 Token(令牌)

  • 访问资源接口(API)时所需要的资源凭证
  • 简单 token 的组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)
  • 特点:
    • 服务端无状态化、可扩展性好
    • 支持移动端设备
    • 安全
    • 支持跨程序调用
  • 我们访问表单页面,服务器在返回表单页面时,会生成一个token值,保存在session中,并把这个值传给表单页面,当我们输入用户名密码后,点击提交,会把用户名密码以及token一起提交,服务器会把提交过来的token值与session中的值相比,如果相同就通过验证,不同就不通过,即使用户名密码是对的也不会通过。token验证成功后,会更新一个新的token,如果进行重复提交,那么提交过来的token还是原来的token值,而服务器session中的值已经更新了,就会验证失败,从而防止了重复提交表单。
token防爆破原理

① 当客户端发送请求时,服务器会对用户信息使用HS256算法及密钥进行签名,再将这个签名和数据一起作为Token一起返回给客户端

② 服务器不保存Token,客户端保存Token

③ 当客户端再次发送请求时,在请求信息中将Token一起发给服务器

④ 服务器用同样的HS256算法和同样的密钥,对数据再进行一次签名,和客户端返回的Token的签名进行比较,如果验证成功,就向客户端返回请求的数据

什么是 JWT

  • JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
  • 是一种认证授权机制
  • JWT 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)。JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。
  • 可以使用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。因为数字签名的存在,这些传递的信息是可信的。
有token时,一定要设置重定向!

命令注入

命令注入就是在需要输入数据的地方输入了恶意代码,而且系统并没有对其进行过滤或者其他处理导致恶意代码也被执行,最终导致数据泄露或者正常数据被破坏。

常用到的命令:(总结来说就是系统操作命令DOS命令都可以在此执行试试)

ipconfig,net user(查看系统用户),dir(查看当前目录),find(查找包含指定字符的行),whoami(查看系统当前有效用户名)

windows与Linux

“|”:command1 | command2; 直接执行后面的命令;

“||”:command1 || command2; 只有前面为假(执行错误)才会执行后面的命令。ping 2 || ipcongfig

“&”:command1 & command2; 无论前面真假,都会执行后面的语句。

“&&”:command1 && command2; 只有前面为真,才会执行后面的语句。Ping 127.0.0.1 && whoami

另Linux中

“;”:command1 ; command2; 执行完前面的语句再执行后面的语句。


文件上传

一些文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者像某个可通过web访问的目录上传任意php文件,并能够将这些文件传递给php解释器,就可以在远程服务器上执行任意php脚本。根据具体漏洞的差异,此处上传的脚本可以使正常后缀的php,asp以及jsp脚本,也可以是篡改后缀后的这几类脚本。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

造成文件上传漏洞的原因及原理

原因:

1 对于上传文件的后缀名(扩展名)没有做较为严格的限制

2 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查

3 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)

4 对于web server对于上传文件或者指定目录的行为没有做限制

strrpos(string,find,start)函数返回字符串find在另一字符串string中最后一次出现的位置,如果没有找到字符串则返回false,可选参数start规定在何处开始搜索。

getimagesize(string filename)函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。可以看到,High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。


文件包含

开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含。

文件包含漏洞:

开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。

文件包含漏洞用到的函数

require:找不到被包含的文件,报错,并且停止运行脚本。

include:找不到被包含的文件,只会报错,但会继续运行脚本。

require_once:与require类似,区别在于当重复调用同一文件时,程序只调用一次。

include_once:与include类似,区别在于当重复调用同一文件时,程序只调用一次。

low

首先是本地文件的获取,php.ini文件获取:由于这个文件在dvwa-master里面所以我们用
…/…/来获取上两级目录page=…/…/php.ini(这是点点斜杠)

XSS分类

XSS有三类:反射型XSS(非持久型)、存储型XSS(持久型)和DOM XSS

1、反射型XSS

发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,故叫反射型XSS。

2、存储型XSS

存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码

最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与Js解析执行,于是触发了XSS攻击。

3、DOM XSS

DOM XSS和反射型XSS、存储型XSS的差别在于DOM XSS的代码并不需要服务器参与,触发XSS靠的是浏览器端的DOM解析,完全是客户端的事情。

XSS(DOM)

low
常见xss语句:

<div><script>alert(/xss/)</script></div> 输出xss

<script>alert(1)</script>输出1
<svg οnlοad=alert(document.cookie)>在页面加载完之后,会弹出一个警示框显示当前文档的cookie信息。
<img src=1 οnerrοr=alert(1)>(如果在加载图片时发生错误则执行 JavaScript )
<a href=javascript:alert(1)>这是一个HTML标签的语法,其中是一个超链接标签,href属性用于指定链接的目标网址。在这个例子中,href的值是"javascript:alert(1)“,意味着点击该链接时会执行一个JavaScript代码,弹出一个警告框显示数字1。这种代码被称为"XSS攻击”,可以在不安全的网站上进行恶意操作。

相关函数:

array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。 提示:如果指定数组的时候省略了键名,将会生成从 0 开始并以 1 递增的整数键名

array_key_exists(key,array)

key 必需 规定键名。

array 必需。规定数组

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)

stripos(string,find,start)

string 必需 规定被搜索的字符串。

find 必需 规定要查找的字符。

start 可选 规定开始搜索的位置。

返回值: 返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释:字符串位置从 0 开始,不是从 1 开始。

medium

(1)简单来说,就是过滤掉了“<script”,当函数匹配到 <script 字符串的时候就会将URL后面的参数修正为 ?default=English

(2)在这里可以通过onerror事件,在装载文档或图像的过程中如果发生了错误就会触发

构造payload(这里的标签 </option></select> 是根据页面源码写的):

English</option></select><img src=x οnerrοr=alert(1)>

high

English#<script>alert(1)</script>

我们在english后面加了注释符,很多人问了注释符不就代表后面的语句不会执行了吗,那闭合又有什么用呢。哎,这就是DOM与其他的最大的区别了因为DOM是不会和后端的服务期进行交互的,它只是利用DOM解析树,而DOM解析树依旧会解析注释符后面的语句,只要解析了就可以成功执行。

XSS(Stored)

low

源码中出现的函数:

(1)trim()函数

语法:

trim(string,charlist)函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。

参数

描述

string

必需。规定要检查的字符串。

charlist

可选。规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符:

  • "\0" - NULL
  • "\t" - 制表符
  • "\n" - 换行
  • "\x0B" - 垂直制表符
  • "\r" - 回车
  • " " - 空格
(2)stripslashes()函数

语法:

stripslashes(string)

参数

描述

string

必需。规定要检查的字符串。

用于删除反斜杠,可用于清理从数据库中或者从 HTML 表单中取回的数据。

medium

Message处使用了htmlspecialchars()函数,将字符全部转为了HTML实体,因此Message处无法使用XSS形成攻击。

name处做了长度限制,因此考虑使用抓包在BP中修改name的值,还有就是他会将 <script> 转化为空,所有考虑使用双写或者大小写去绕过。

high

(.*)通配符

/i:忽略大小写

Name处对 <script> 做了限制,各种形式的 <script> 都不行了,考虑使用其他的标签,比如img

XSS(reflected)

medium

str_replace()函数

语法

str_replace(find,replace,string,count){区分大小写}

参数

描述

find

必需。规定要查找的值。

replace

必需。规定替换 find 中的值的值。

string

必需。规定被搜索的字符串。

count

可选。对替换数进行计数的变量。

high

header ("X-XSS-Protection: 0")

句法

X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>

0: 禁止XSS过滤.

1 启用 XSS 过滤(通常在浏览器中默认):如果检测到跨站点脚本攻击,浏览器将清理页面(删除不安全的部分)。

mode = block 启动 XSS 过滤。如果检测到攻击,浏览器将阻止页面的呈现,而不是过滤页面中的XSS内容。

report = <reporting-URI>(仅限 Chromium)启用 XSS 筛选。如果检测到跨站点脚本攻击,浏览器将清理页面并报告违规行为。这使用 CSP report-uri指令的功能发送报告。

换标签不用script用img

CSRF

low

在真实地攻击环境中,我们通常是给受害者发送一个链接,而在正常的情况下我们通常不会点击一个很长的看起来就不正常的链接,这个时候我们就需要好好学习社会工程学,学会利用人们的心理来达到我们的目的,诱使他们点击我们构造的链接通常情况下会把长链接构造成一个短链接,这个时候我们可以利用网上很多在线工具)

比如:站长工具:短链接生成器

medium

if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )

PHP stripos() 函数:查找字符串在另一字符串中第一次出现的位置

这段代码的意思是,如果当前页面的HTTP_REFERER中包含了SERVER_NAME,则返回true。对用户请求头的中的Referer字段进行验证 即用户的请求头中的Referer字段必须包含了服务器的名字

high

High级别的代码增加了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端请求。

思路:利用xss,xss可以执行代码,获取token(在这路利用XSS其实是获取的cookie值,但是cookie值中是包含token值的,所以在这个地方我们使用XSS执行。

SQL注入

sqlmap工具注入:

1.--dbs 获取数据库

2.-D 数据库名 --tables 获取库中所有表

3.-D 数据库名 -T 表名 --columns 获取表中所有字段

4.-D 数据库名 -T 表名 -C "字段,字段" --dump 获取表字段对应的数据

在后面加上--batch默认回答

sql注入语句的万能语句 ’or 1=1#
SQL注入流程

拿到一个查询条件的web网页,就需要对输入框做以下的事情

1.判断是否存在注入,注入是字符型还是数字型

2.猜解SQL查询语句中的字段数

3.确定显示的字段顺序

4.获取当前数据库

5.获取数据库中的表

6.获取表中的字段名

7.下载数据

一、MySQL中CONCAT函数
1.功能

将多个字符串连接成一个字符串

2.语法

CONCAT(str1,str2,…)

二、MySQL中CONCAT_WS函数
1.功能

和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)

2.语法
CONCAT_WS(separator,str1,str2,...) 
3.使用方法

说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

//默认分隔符为逗号
mysql> SELECT CONCAT_WS(',','张三','李四','王五');
result> 张三,李四,王五
//和MySQL中CONCAT函数不同的是, CONCAT_WS函数在执行的时候,不会因为NULL值而返回NULL 
mysql> SELECT CONCAT_WS(',','张三',NULL,'王五');
result> 张三,王五
三、MySQL中GROUP_CONCAT函数
1.功能

将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

2.语法
GROUP_CONCAT( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

asc是升序,desc是降序

3.使用方法

通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

(1)以c_fid分组,把name字段的值打印在一行,逗号分隔(默认)
mysql> select c_fid,group_concat(name) sName from Student group by c_fid;

result>

c_fid

sName

1

张三,赵六,杨雪

2

李四,王五

(2)以c_fid分组,把name字段的值打印在一行,分号分隔
mysql> select c_fid,group_concat(name separator ';')  from Student group by c_fid;

result>

c_fid

Name

1

张三:赵六:杨雪

2

李四:王五

(3)以c_fid分组,把去冗余的age字段的值打印在一行,逗号分隔
mysql> select c_fid,group_concat(distinct age) sAge from Student group by c_fid;


1

result>

c_fid

sAge

1

17,20

2

18,20

(4)以c_fid分组,把sex 字段的值打印在一行,逗号分隔,以age排倒序
mysql> select c_fid,group_concat(sex order by sex desc) from student group by age;


1

result>

c_fid

sSex

1

2,1

2

2

2

2,1

low

获取数据库里的表

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

查找表users的字段

1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' #

查找数据

1' union select group_concat(user),group_concat(password) from users #

知识点:1.在MYSQL5.0以上版本中存在自带数据库information_schema,他是一个存储所有数据库名,表明,列名的数据库,相当于可以通过查询此库获得相应信息。(没有的话只能靠猜,暴力破解)

2.符号“.”代表下一级: Information_schema.tables:

medium

$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
Medium级别的代码利用mysql_real_escape_string函数对如下特殊符号进行转义,

  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a
high

防御了自动化的SQL注入(SQLmap注入),剩下与medium无区别.

SQL盲注

QL Injection(Blind),SQL盲注,与一般注入的区别是,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高,目前网络上现存的SQL注入漏洞大多是SQL盲注。

(过程怎么说呢,只说明一下思路因为主要是猜,然后具体名字就是无数遍的二分法等算法猜)

盲注分为:基于布尔的盲注、基于时间的盲注、基于报错的盲注

盲注的一般步骤

1.判断是否存在注入、注入是字符型还是数字型

2.猜解当前数据库名称

3.猜解数据库中的表名

4.猜解表中的字段名

5.获取表中的字段值

6.验证字段值的有效性

7.获取数据库的其他信息:版本、用户…

布尔型盲注

1.布尔盲注利用前提
页面没有显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常来判断是否存在注入。
2.布尔盲注利用
该语句判断数据库个数,当数据库个数大于n页面显示正常
(select count(schema_name) from information_schema.schemata)> n

该语句判断数据库内第一个数据库名有多少字符,字符个数大于n页面显示正常
(select length(schema_name) from information_schema.schemata limit 0,1)> n

该语句判断第一个库第一个字符是什么,ascii值大于n页面显示正常
(select ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1)))>n

时间盲注

1.时间盲注利用前提
页面上没有显示位,也没有输出SQL语句执行错误信息。 正确的SQL语句和错误的SQL语句返回页面都一样,但是加入sleep(5)条件之后,页面的返回速度明显慢了5秒。
2.时间盲注利用
该语句判断数据库个数,当数据库个数等于n页面返回延迟5秒
if((select count(schema_name) from information_schema.schemata)=n,sleep(5),1)
该语句判断数据库内第一个数据库名有多少字符,字符个数等于n页面返回延迟5秒
if((select length(schema_name) from information_schema.schemata limit 0,1)=n,sleep(5),1)
该语句判断第一个库第一个字符是什么,ascii值等于n页面返回延迟5秒
if((select ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1)))=n,sleep(5),1)

判断注入类型:

$id

数字型(id=$id)

字符型 (id=’$id’)

1 and 1=1

id=1 and 1=1 返回正常

id=‘1 and 1=1’ 返回正常

1 and 1=2

id=1 and 1=2 返回错误

id=‘1 and 1=2’ 返回正常

1 or 1=1

id= 1 or 1=1 返回正常

id= ‘1 or 1=1’ 返回正常

1 or 1=2

id=1 or 1=2 返回正常

id=‘1 or 1=2’ 返回正常

1’

id=1’ 返回错误

id=‘1’’ 返回错误

1’ --+

id=1’ --+ 返回错误

id=‘1’ --+’’ 返回正常

猜数据库名字

查找库名(以数据库名的第一个字母为例)(最终查到的库名:dvwa)

输入1’ and ascii(substr(databse(),1,1))>97 #,显示存在,说明数据库名的第一个字符的ascll值大于97(小写字母a的ascll值);

输入1’ and ascii(substr(databse(),1,1))<122 #,显示存在,说明数据库名的第一个字符的ascll值小于122(小写字母z的ascll值);

输入1’ and ascii(substr(databse(),1,1))<109 #,显示存在,说明数据库名的第一个字符的ascll值小于109(小写字母m的ascll值);

输入1’ and ascii(substr(databse(),1,1))=100 #,显示存在,说明数据库名的第一个字符的ascll值为100(小写字母d的ascll值)

找数据库中的表

首先确定数据库中表的数量
1' and (select count (table_name) from information_schema.tables where table_schema=database())=x # (x为大于等于1的整数)
当显示存在时即可判断表的数量
最终当x=2显示存在即表的数量为2

然后确定表的长度
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=x #(x为大于等于1的整数)
当显示存在时即可判断表的长度
当x=9显示存在即表的长度为9

然后同样二分法确定表名
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>或<字母的ascii值 #
通过比较输入字母的ascii值的显示正常与否来逐个确定表名 步骤同第二步

  • 29
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值