Intro
2 select
点击submit后, 查看数据包,发往/SqlInjection/attack2
, 表单数据为query: select * from Employees where first_name='Bob';
别的查询都不会返回数据.
查看代码
设置了TYPE_SCROLL_INSENSITIVE
The constant indicating the type for a ResultSet object that is scrollable but generally not sensitive to changes to the data that underlies the ResultSet. 对于底层数据变换不敏感
和CONCUR_READ_ONLY
只读.
后面就是查询后,判断department里有没有Marketing
, 有就判定答对了.
所以我们输入select 'Marketing' as department from employees;
也可以达到完成(Doge)
3 update
输入update employees set department='Sales' where first_name='Tobi';
找/SqlInjection/attack3
几种Statement可以在JDBC - Statements, PreparedStatement and CallableStatement - Tutorialspoint查看一些细节, 总的来说就是用来连接数据库和执行sql的.
statement执行executeupdate
后, 如果connection最后不执行commit,对数据的更改不会返回到数据库中.
所以输入update employees set department='Sales'
也可以
4 alter
提交更改后,查询是否有phone这个字段,不报错就返回成功
5 GRANT CREATE TABLE TO
执行后, 再去查询是否真的授予了权限
9 string sql注入
正确选择后,发送到/SqlInjection/assignment5a
account: Smith'
operator: or
injection: '1' = '1
这里的query就是最经典的sql注入写法了
10 Numeric SQL injection
/SqlInjection/assignment5b
login_count: 1
userid: 1 or 1=1
?
就是PreparedStatement里的用法,会先进行sql预编译, 完成下图的解析和规范, 编译, 优化,然后将语句存在缓存中等待调用.
当用户数据来的时候,就会直接替换掉? 这里不存在再次编译, 所以也就不会解析用户数据了.
代码会先解析count为数字,然后设置到查询中, 但是这里的userid还是拼接的so.
11
/SqlInjection/attack8
表单数据
name: a
auth_tan: 3SL99A' or '1'='1
拼接数据, 判断大于单行就算过了
12
也是拼接, 但是可以通过堆叠注入执行额外的sql语句.
通关条件就是(results.getString(2).equals("John")) && (results.getString(3).equals("Smith"))
advanced
3
/SqlInjectionAdvanced/attack6a
拼接参数. 但是会通过正则匹配是否有使用union
(?i)(^[^-/*;)]*)(\s*)UNION(.*$)
正则可以在 https://regex101.com 查看详细
要求是使用union和output.toString().contains("dave") && output.toString().contains("passW0rD")
5
/SqlInjectionAdvanced/challenge_Login
一看就知道没戏的,只能去试试注册了
/SqlInjectionAdvanced/challenge
注册也是拼接,下面别的地方也没办法了,只能在这里进行堆叠然后更新tom的密码了.
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付