less-1
这一题是get型注入,先用单引号,双引号,来判断是否存在注入点。
可以看到报错信息中' '1' ' limit 0,1 ' 中间多了个'这就是我们写进去的' 这样就可以知道 要执行的sql语句是什么了。
select * from xx where id='$id' ;我们要把后面的'注释掉,再用常规注入语句就好了。
less-2
get型注入,先判断注入点,得到下面的报错信息
我们把前后''去掉,因为这是报错时报错信息自己加的,所以报错语句就是 ' limit 0,1 多了个单引号,并且也没法注释。很明显,这就是个数字型的注入。不需要单引号,双引号,直接用注入语句就可。
less-3
get型注入,判断注入点 ,得到报错信息:
看 ‘1’’)的报错信息。可以知道sql 查询语句大概时这样的 select * from xx where ( ' $id ' ) ;所以我们需要 用 ') 后面把‘)注释掉,完成查询语句的闭合,最后再通过注入语句得到信息。
less-4
把括号中的单引号改成了双引号的区别,从报错信息中就能看出来!
less-5
gei型注入,有报错信息
单引号 后面加注释闭合。得到的是:
没有回显,可是有报错,我们就可以用报错注入,
查询表名:1' and extractvalue(1, concat(0x5c, (select group_concat(table_name) from information_schema.tables where table_schema=database())))%23 加粗这段便是我们能改的查询语句。
查询列名:1' and extractvalue(1, concat(0x5c, (select group_concat(column_name) from information_schema.columns where table_name='emails')))%23
最后查询字段名::1' and extractvalue(1, concat(0x5c, (select group_concat(id) from emails)))%23 id 是字段,emails是表名
这里也可以使用盲注来注入,,毕竟盲注太麻烦,就不写了。。。
less-6
和上题一样,但是查询语句是这样的
查询语句并没有双引号,但是上面变量id早就给$id 连了个双引号。所以查询语句变为 $sql="select * from users where id="查询语句 " limit 0,1 "
改个双引号就好。
less-7
和上题差不多,但是闭合点我认为是非常难想到的,这里展示下源码
双括号的闭合。你只要' )) # 注释继就行,但是在报错信息不全的提醒下,,如何想到双括号的闭合啊!!!!!我真的很懵。。下次要和给你出个3括号怎么办?? 总有人和我说这是经验! .没错。。现在我告诉你们,这就是经验!
less-8
get 型注入,,没有报错信息,那只能考虑盲注了。
在源码中报错信息都被注释掉了。 首先是查询他的数据库
?id=1' and length(database())=8 --+ 查询他的数据库几位
?id=1' and ascii(substr(database(),1,1))=115 --+ 猜测数据库的第一位的ascii码
?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))=6 猜测第一张表的名字的长度
就像猜测数据库第一位的ascii码一样,你也同样用ascii(substr()) 来猜测表的名字的ascii 再猜 列名,最后猜字段值。
less-9
这是个基于时间的盲注,从不管你输入id=1 还是id=0 都是一个结果,所以我们要使用延时注入。运用sleep()函数,
' and if(1=0,1, sleep(10)) --+
" and if(1=0,1, sleep(10)) --+
) and if(1=0,1, sleep(10)) --+ 这是判断是否时间盲注的语句。如果语句对的并且查询到就会延迟10秒
') and if(1=0,1, sleep(10)) --+
") and if(1=0,1, sleep(10)) --+
?id=1' and if(length(database())=8,sleep(5),1)--+ 爆数据库的长度
?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),1) --+ 爆数据库的第一个字的ascii码
?id=1'and If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1))=117,sleep(5),1)--+
猜测第四个表的第一位的ascii码, limit 0,1 第一个表 substr(xx,1,1)取第一位的第一个。
less-10
也是一个时间盲注,,他的查询语句和上题不同,,是双引号的查询语句 其他做法是一样的。
less-11
Post型的注入
先来看一手源码:
没有对输入框中的提交信息过滤。所以我们可以直接在输入框中注入
查询语句中 username 和password 都有单引号,都能注入。这里用基本的注入语句就可以了。
less-12
post型注入,先用单双引号判断注入点,有报错信息!
很明显 他的查询语句就是 ,select * from xx where username=("xx")and password=(" xx") limit 0,1; 所以这里的闭合点就是 ”)加注释 #
然后在用常规注入语句就好了
less-13
post型注入,先用单双引号判断注入点,,也有报错信息。
很明显的 用 ’)加注释 闭合就可以了。 但是这题没有回显的,有报错信息就可以用报错注入,
admin ' ) and extractvalue(1,concat(0x5c, (select group_concat(table_name) from information_schema.tables where table_schema=database()))) # 爆表名
admin ')and extractvalue(1, concat(0x5c, (select group_concat(column_name) from information_schema.columns where table_name='emails'))) # 爆列名
admin') and extractvalue(1, concat(0x5c, (select group_concat(id) from emails))) # 爆字段值
less-14
post型注入 先用单双引号判断注入点,报错信息:
这里很明显 " 号是会报错的,因为多了个“。 那”加上注释# 能成功登陆。
那猜想他的源码应该是 select * from xx where username=" $username " && password =" $password " limit 0,1; “#就可以闭合了,再用常规的爆破注入语句就好。
less-15
post型注入 用单双引号判断注入点,没有报错信息。 那就要试试 admin ' # 或者
admin "# ,admin ' # 发现是登陆成功的。 那么查询语句应该就是 用 单引号 注释来闭合语句的。 这边没有报错信息的话,就用布尔县盲注来进行注入吧。 注入语句就和上面一样操作。
less-16
在这种没用报错信息的注入下,我们就要一个个试试, admin ' # 错误,admin " #错误
admin ") # 对 admin ')错误,其实就是猜测他的查询语句的闭合方式,哪种登陆成功就哪种就是闭合方式! 那我们试出了admin ") # 的闭合 那么再用盲注注入 进行爆库,表,列,值
这是他的源码:
less-17
首先我们看看源码,
check_input 函数
这就是这个系统函数进行的过滤,那么我们只能用密码框来提交注入语句,单双引号判断注入点,又报错信息,很明显的‘ 加注释闭合语句。那就可以用报错语句,和使用上面报错语句就可以了!
less-18
报文头注入和Cookie 注入
X-Forwarded-For 字段可用于注入
User-agent 字段,Referer 字段 ,Cookie字段 可用于注入
(没有很好的过滤情况外!)
这道题一开始就提醒了报文头注入 user_Agent,那想想注入点都不会在输入框中,而是在报文头中的user_Agent,用burp suite 截包,改包,注入 ,因为是有报错信息的,所以我们用报错注入 。报错语句也和上面的报错语句一样使用。
看看这题的源码
check_input 把表单提交的过滤了
宽字节注入
宽字节注入就是利用mysql中的特性,mysql在使用 GBK编码时,会认为两个字符是一个汉字。这样我们就能通过把转义的字符绕过。
addslashes 函数是经常用于sql注入的过滤,在预定义字符前添加反斜杠/。导致查询语句出错。这时我们在预定义字符前加%df,他会和反斜杠/ %5c组成一个汉字,从而使%27 (’)逃逸出来!
那么mysql怎么判断一个字符是不是汉字,根据gbk编码,第一个字节ascii码大于128,基本上就可以了。比如我们不用%df,用%a1也可以:
mysql不仅是使用GBK编码时,会认为两个字符是一个汉字,还有很多多字节编码,也可以进行宽字节注入!我们可以这样认为:只要低位的范围中含有0x5c的编码,就可以进行宽字符注入。
mysql_real_escape_string
必须连接数据库才能使用 他的转义字符为
来看一个具体的用法,
less-36
当你用单双引号进行判断的时候,没用报错,如图
下面给了你提示,,1‘ 被转义成了 1\' 字符串这样导致了你没有报错,看下源码,
这里他用的是mysql_real_escape_string函数,sql查询语句中$id 被单引号闭合,并且还告诉我们有报错信息,print_r(mysql_error())。所以证明1' 被转义成 1\'字符串。那我们就可以通过在\'前加%fg ,%df 这种第一个ascii大于128 的
又报错信息了,说明 有单引号了,这样就可以进行下一步注入了。
进行报错注入的时候发现一个问题,
报错了。这里也有两个单引号,那我们用%df来绕过有用吗?结果是出错了的,因为 %df' security %df' ,我们前面说 %df 和单引号的转义反斜杠 组成了一个汉字,,那么这个汉字就在两个单引号之间了啊,那你查询的数据库名字就出问题了,导致你怎么也查不出表名!这里我们可以使用
用16进制来表达 数据库名字。就可以了!
堆叠注入 stacked injection
注入原理:平常我们注入时都是通过对原来sql语句传输数据的地方进行相关修改,注入情况会因为该语句本身的情况而受到相关限制,例如一个select语句,那么我们注入时也只能执行select操作,无法进行增、删、改,其他语句也同理,所以可以说我们能够注入的十分有限。但堆叠注入则完全打破了这种限制,其名字顾名思义,就是可以堆一堆sql注入进行注入,这个时候我们就不受前面语句的限制可以为所欲为了。其原理也很简单,就是将原来的语句构造完后加上分号,代表该语句结束,后面在输入的就是一个全新的sql语句了,这个时候我们使用增删查改毫无限制。
使用条件:堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁
less-38 堆叠注入实例
这题就是一个简单的单引号的闭合,关键是在执行完id=1后,我又写了一条语句,添加一条信息到Users表中。
添加成功,这就是堆叠注入。可以执行多条语句!关键还是查询语句要先闭合!
排序注入 order by 注入
就是我们可控制的位置在order by 子句之后,
'select * from xxx order by '$id'';
如何判断这个是可注入点,有无注入点,以及如何闭合时关键。
less-46
这题是数字型的排序注入,如果判断是否存在排序注入呢?
这是降序
升序,排列的顺序改变了,那么就存在排序注入,但是有时候这种判断是没有用的。比如less-47 所以我也没怎么理解!
闭合方法也就之前那些,如果有报错信息的话,那就可以用报错注入语句注入,也可以用盲注,时间盲注。用一些函数来进行盲注
rand((ascii(left(database(),1))=115))