Shae (Danielle Panabaker) is a young college student living in New York City. After classes, she decides not to attend a party at a local club called the Cave her friend Karen (Reyna de Courcy). Shae tells Karen that she is going to The Hamptons for the weekend with her boyfriend Terry (Andrew Howard), an older man who is separated from his wife. That evening, Terry arrives at Shae's apartment. He apologizes and says that they can't see each other any more because he and his wife have decided to reconcile, for the sake of their young daughter. Shae tells Terry to leave, and she is beside herself.
The next day, Shae goes shopping at a local farmer's market and sees Terry with his wife and daughter. She follows them to their rowhouse and he notices her. They do not speak and after he closes the door, she leaves. That night, Shae goes to a nightclub where she works as the bartender. During her shift, she goes to the cloak room and starts to cry. She is interrupted by her colleague Lu (Nicole LaLiberte), who comforts her and invites her out for a drink over Shae's breakup with Terry. Shae and Lu go out to another bar where they meet Simon (Michael Stahl-David), Eric (Carmine DiBenedetto) and Duncan (Will Brill).
They drink and dance with them and then go back to Eric and Duncan's apartment. Shae kisses Simon and then goes to the bathroom, where she passes out, drunk. Shae wakes up a little later when it is dawn. Feeling unwell again, Shae decides to go home. Simon offers to take her home, saying that he was about to leave anyway.
They get a taxi together and are dropped off outside her apartment building. He asks if he can come up, but she tells him she has a boyfriend. He persists, asking first for her number and then for a kiss goodnight. She tells him to leave and he suddenly becomes violent, grabbing her neck and forcibly kissing her. She hits him and runs upstairs. Before she can unlock her door, he catches her, pushes her onto the floor and rapes her in the hallway.
Later, in her apartment, Shae tries to call her mom and Karen, but can only reach their voice mails. With no one to talk to, she goes to Terry's house. He is furious that she has turned up at his house unannounced and takes her home. They go into her apartment and Shae, having not told him that she was raped yet, hugs him. He misunderstands and starts kissing her.
She tells him to stop but he tries to force himself on her. She shouts at him to get off her and starts crying. He leaves, telling her that he doesn't know what she wants from him. The next day, Lu calls Shae who tells her about being sexually assaulted. They go to a police station to report the crime. However, the hostile and skeptical desk sergeant, Officer Daniels (Matthew Rauch), gives Shae paperwork to fill in and sends her to the waiting area. Shae files her report with an unsympathetic detective (Kelvin Hale) and Lu notices Daniels looking at her.
She flirts with him and she asks him if he wants to go somewhere to have sex. The go a local hotel where Lu cuffs him to the bed, takes his gun and shoots him dead. Lu goes to Shae's apartment and tells her that they need to deal with the situation themselves, by going back to Eric and Duncan's apartment and finding out where Simon lives for Shae to get her revenge. She tells Shae that she has a gun, which she got from a police officer. They go back there and probe Duncan for Simon's address. He doesn't know it and when he jokes about how Eric told them he and Shae had sex, Lu shoots him dead. Shae laughs and then throws up, but tells Lu that she is okay with it. When Eric comes back, he tells them Simon's address and Lu shoots him too.
Shae and Lu go to Simon's workshop in Brooklyn and find him working alone. Shae knocks him unconscious and they tie him to his table. When he wakes up, Lu brutally tortures him by cutting off his feet with a power saw. When he continues to be defiant, Shae finishes him off by shooting him in the head, killing him. Next, Shae and Lu ambush Terry, kidnapping him at gunpoint and driving him off in his own car. They drive to a secluded part of the woods and take him out of the car.
Shae points the gun at him and he begs for her forgiveness. She can't bring herself to kill him and he starts to run away but Lu takes the gun and shoots him. Shae and Lu drive in Terry's car to a local motel where they stay the night. During the time there, Shae begins crying over Terry's death. Lu crawls out of her bed gets into Shae's bed and holds her. The next morning while eating at a nearby diner, they talk about what they did. Shae says that killing all those men who wronged her did not make her feel any better.
However, Lu claims that she enjoyed it and says that she enjoys killing and hurting people because she can. They drive back to the city and return to their lives. Some time later, after a class, Shae is asked out by her friendly classmate Tyler (Liam Aiken) and they go to the fair on Coney Island. She goes back to her apartment that evening and finds Lu waiting for her, annoyed that she is back so late because she had wanted to surprise her with a ready dinner.
A few days later, Shae goes to a Halloween costume party with Tyler, who is working as the disk jockey. Lu secretly arrives dressed in a white mask with a sumari robe. When Shae is in the bathroom and everyone else is watching fireworks on the roof, Lu kills Tyler with a sword. Shae finds his body and returns home, finding Lu's sword on a table. Lu steps out of the shower, stark nude, and tells Shae that she did it "for us" and to "protect" her. Shae takes the sword and kills Lu by slashing her abdomen wide open.
As the film comes to an end, Shae returns to work at the bar (leaving everything ambiguous if Shae and Lu's killing spree really happened). During a break, Shae is interrupted by a crying co-worker (Makenzie Leigh). Shae asks "is it a guy?" and the woman replies that it is. As the two sit together smoking cigarettes, a vision of Lu is seen behind Shae... yet again leaving everything up in the air if Lu was a real person or just a part of Shae's twisted imagination..