Solidity has a lot of surprising and actually shitty characteristics. On thing is that a struct can be defined both in memory and in storage as well similarly to arrays. The problem is however that if you define your struct in a local function body, it overwrites the storage variables of the contract itself. On top unfortunately, if you create a struct in a function body without explicitly marking if it is a storage or a memory one, it is created automatically as a storage. So the following example:
contract StructHack {
uint public myNum = 0;
struct TestStruct {
uint structNum;
}
function hackStruct() {
TestStruct test;
test.structNum = 22;
}
}
Surprisingly, if you deploy the contract and call the function hackStruct, the myNum value will be initialized to 22.