SQL注入之SQL Server增删改查

SQL注入之SQL Server增删改查 kali里面docker拉了一个怎么搭建把命令甩ai就行启动命令如下sudo docker exec -it sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P Kali2026Sec! -C建立库和表首先还是创建数据库CREATEDATABASEtestdb;GO这里的GO是确保命令立即生效可以从下面的截图中看到输入第一行回车之后变成了第二行说明这整一个语句还没有结束这个GO会告诉sqlcmd将之前输入的所有T-SQL语句作为一个批次发送给服务器执行然后是切换到刚刚建立的数据库USEtestdb;GO可以看到在命令行中会有相应的提示再之后是建表CREATETABLEEmployees(IDINTPRIMARYKEYIDENTITY(1,1),NameVARCHAR(50),AgeINT);这里面后两个好理解关键是第一行部分含义底层解释ID列名这一列的名称叫做 “ID”INT数据类型整数类型Integer取值范围约为-21亿 到 21亿PRIMARY KEY主键约束唯一标识每一行值必须唯一且非空。数据库会自动为该列创建聚集索引Clustered Index数据在物理存储上按该列顺序排列IDENTITY(1,1)自增属性(1,1)表示起始值为 1每次递增 1。插入数据时无需手动指定该列值数据库会自动生成顺序编号1, 2, 3, 4…保证永不重复主键约束和自增属性也可以不加如果不加主键约束的话就代表会产生以下效果允许重复的 ID 值插入两行 ID1 都可以允许 ID 为 NULL没有唯一标识每一行的保障查询大量数据时速度会慢因为没有自动创建聚集索引自增不加的话就代表每次要手动指定ID的值命令如下INSERTINTOEmployees(ID,Name,Age)VALUES(1,Alice,30);INSERTINTOEmployees(ID,Name,Age)VALUES(2,Bob,25);如果加了主键约束的话需要确保每次加入的id值不相同那么再回到最开始的命令后面就是在表格中填入相应的内容然后进行查看INSERTINTOEmployees(Name,Age)VALUES(Alice,30);INSERTINTOEmployees(Name,Age)VALUES(Bob,25);GOSELECT*FROMEmployees;GO更新和删除UPDATE更新的语法如下UPDATE表名SET列名新值WHERE条件;那么比如将Alice的年龄改为31UPDATEEmployeesSETAge31whereNameAlice;go或者将原来的Bob改为另一个人UPDATEEmployeesSETNameShoreKitenWHEREAge25;UPDATEEmployeesSETNameShoreKitenWHEREID2;UPDATEEmployeesSETNameShoreKitenWHERENameBob;如果where没有写的话那就是全部数据都进行更改UPDATEEmployeesSETAge18;goDELETE语法如下DELETEFROM表名WHERE条件;删除Alice的数据DELETEFROMEmployeesWHERENameAlice;GO这里也可以看到Shorekiten的ID仍为2并没有因为前一个数据的删除而减少还有一种删除方法是对全表进行删除但保留表原来的结构TRUNCATETABLEEmployees;GOWHERE进阶查询先往表里面加几条数据因为之前全删了因此把最开始的也放进来INSERTINTOEmployees(Name,Age)VALUES(Alice,30);INSERTINTOEmployees(Name,Age)VALUES(Bob,25);INSERTINTOEmployees(Name,Age)VALUES(David,35);INSERTINTOEmployees(Name,Age)VALUES(Eva,28);INSERTINTOEmployees(Name,Age)VALUES(Frank,42);INSERTINTOEmployees(Name,Age)VALUES(Grace,23);INSERTINTOEmployees(Name,Age)VALUES(Henry,31);INSERTINTOEmployees(Name,Age)VALUES(Ivy,29);GOAND / OR组合条件SELECT*FROMEmployeesWHEREAge25ANDAge35;GOSELECT*FROMEmployeesWHEREAge25ORAge40;GOIN在某个集合中-- 年龄是 25、30、35 的人SELECT*FROMEmployeesWHEREAgeIN(25,30,35);GO-- 等价于用 OR 写SELECT*FROMEmployeesWHEREAge25ORAge30ORAge35;GOBETWEEN区间范围包含边界SELECT*FROMEmployeesWHEREAgeBETWEEN25AND35;GOLIKE模糊匹配-- 名字以 A 开头的人SELECT*FROMEmployeesWHERENameLIKEA%;GO-- 名字包含 a 的人不区分大小写SELECT*FROMEmployeesWHERENameLIKE%a%;GO-- 名字以 y 结尾的人SELECT*FROMEmployeesWHERENameLIKE%y;GOIS NULL / IS NOT NULL空值判断先加一条有空值的测试数据INSERTINTOEmployees(Name,Age)VALUES(Jack,NULL);GO-- 查询 Age 为空的人SELECT*FROMEmployeesWHEREAgeISNULL;GO-- 查询 Age 不为空的人SELECT*FROMEmployeesWHEREAgeISNOTNULL;GONOT取反SELECT*FROMEmployeesWHEREAgeNOTIN(25,30,35);SELECT*FROMEmployeesWHEREageNOTBETWEEN25AND35;SELECT*FROMEmployeesWHERENameNOTLIKEA%;排序ORDER BY-- 按年龄升序排列默认 ASCSELECT*FROMEmployeesORDERBYAge;GO-- 按年龄降序排列DESCSELECT*FROMEmployeesORDERBYAgeDESC;GO-- 先按年龄降序年龄相同再按名字升序【字母表顺序】SELECT*FROMEmployeesORDERBYAgeDESC,NameASC;GO分页OFFSET FETCH分页公式每页 N 条查第 P 页OFFSET (P-1) * N ROWS FETCH NEXT N ROWS ONLY例如第 3 页每页 5 条OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY注意 OFFSET FETCH 必须有 ORDER BY 配合-- 跳过前 3 条取接下来 3 条第 2 页每页 3 条SELECT*FROMEmployeesORDERBYIDOFFSET3ROWSFETCHNEXT3ROWSONLY;GO最后小综合一下就不给答案了查询出年龄在 25 到 35 之间名字以 ‘A’ 开头或包含 ‘e’按年龄降序排列只显示前 3 条